Callback den Wert undefiniert zurückgibt, mit chrome.storage.sync.erhalten
Baue ich eine Chrome-Erweiterung, und ich schrieb diesen code.
var Options = function(){};
Options.prototype = {
getMode: function(){
return chrome.storage.sync.get("value", function(e){
console.log(e); //it prints 'Object {value: "test"}'.
return e;
});
},
setMode: function(){
chrome.storage.sync.set({"value": "test"}, function(e) {
})
}
}
var options = new Options();
options.setMode();
console.log(options.getMode()); //it prints 'undefined'.
Ich erwartet, dass es zu drucken
Object {value: "set up"}
wenn ich rufe options.getMode()
, aber es druckt undefined
.
Weiß jemand, wie dieses problem zu lösen?
- also, es ist nicht möglich, es überhaupt?
- Nicht in der Weise, die Sie getan haben, ist es im zweiten Beispiel nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
chrome.Speicher
API ist asynchrone - er kommt nicht direkt, sondern übergibt Sie als argument an den callback-Funktion. Die Funktion ruft sich selbst immer zurückundefined
.Dies wird oft verwendet, um andere Methoden zu laufen, ohne zu warten, bis etwas reagiert oder abgeschlossen wurde - ein Beispiel dafür ist
setTimeout
(einzige Unterschied ist, dass es gibt eine timer-Wert, nichtundefined
).Nehmen wir zum Beispiel diese:
Weil
setTimeout
ist asynchron, es wird nicht aufhören, alle code, bis die gesamte Funktion wird eher der Rückkehr zunächst nur eine Funktion aufrufen, wenn es fertig ist später auf - das ist, warum die 0 kommt, die vor dem 1.Aus diesem Grund, Sie nicht einfach etwas wie:
Im Allgemeinen sollten Sie setzen, was Sie wollen in Ihrem Rückruf (die Funktion, die aufgerufen wird, wenn die asynchrone Funktion beendet ist). Dies ist ein Recht häufiges schreiben von asynchronem code:
Konnten Sie einen ganzen Teil des Codes innerhalb der callback - es gibt nichts hindert Sie, dies zu tun. Also anstatt das zu tun, die folgenden:
Wäre dies wohl eine bessere Idee:
test
würde noch undefiniert und Rücksprung aus der Funktion, die gerade nach diesem Anruf.localStorage
ist synchron undchorme.storage
asynchron ist. Was für ein Alptraum, wenn Sie eine Ausrichtung auf beide browser und chrome-app. In meiner situation, die UI-updates, bevor Sie die Einstellungen erhalten Sie vomchrome.storage
, also muss ich die Aktualisierung der Benutzeroberfläche wieder in den Rückruf!Den
chrome.storage.sync.get
ist asynchron aufgerufen wird, das ist, warum Sie haben, um es zu übergeben einen Rückruf, so dass es in der Zukunft ausgeführt.Wenn Sie versuchen, zu drucken, ist der zurückgegebene Wert der
getMode
Sie zum drucken der return-Wert, waschrome.storage.sync.get
zurück nach queuing der asynchrone Aufruf ausgeführt werden.Dies ist ein häufiger Fehler, den Leute machen, die in javascript, während Sie lernen zu verwenden asynch Anrufe.