Ein Versprechen, nur zum Beispiel:
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
Nachdem wir angerufen haben, dann die Methode auf das Versprechen:
P.then(doWork('text'));
Die doWork-Funktion sieht folgendermaßen aus:
function doWork(data) {
return function(text) {
// sample function to console log
consoleToLog(data);
consoleToLog(b);
}
}
Wie kann ich vermeiden, eine innere Funktion in doWork zurückzugeben, um Zugriff auf Daten aus den Versprechungs- und Textparametern zu erhalten? Gibt es irgendwelche Tricks, um die innere Funktion zu vermeiden?
javascript
promise
ecmascript-6
es6-promise
user3110667
quelle
quelle
bind
Methode anzuwenden ? - was auch extrem langsam ist.Antworten:
Sie können
Function.prototype.bind
eine neue Funktion mit einem Wert erstellen, der wie folgt an das erste Argument übergeben wirdund Sie können ändern
doWork
zu,Jetzt
text
wird tatsächlich'text'
indoWork
unddata
wird der Wert durch das Versprechen gelöst.Hinweis: Stellen Sie sicher, dass Sie Ihrer Versprechenskette einen Ablehnungshandler hinzufügen.
Arbeitsprogramm: Live-Kopie auf Babels REPL
quelle
call
Ruft eine Funktion direkt auf,bind
erstellt eine neue Funktion, beide akzeptieren jedoch einen Ausführungskontext als erstes Argument.Die vielleicht einfachste Antwort lautet:
Oder, da dies markiert ist
ecmascript-6
, mit Pfeilfunktionen:Ich finde das am lesbarsten und nicht zu viel zum Schreiben.
quelle
Verwenden Sie Curry.
quelle
curriedDoWork
inreturn new Promise()
der ersten Zeile dieser Funktion ein Versprechen erstellen , wird das Versprechen ausgeführt, sobald Sie anrufencurriedDoWork()
(wie Sie es in..then(curriedDoWork('text'))
Lodash bietet genau dafür eine gute Alternative.
Wenn Sie möchten, dass Ihre Erfolgsfunktion nur einen Parameter enthält (die Ergebnisse des erfüllten Versprechens), können Sie ihn folgendermaßen verwenden:
Dies wird an
text: 'myArgString'
denthis
Kontext innerhalb der Funktion angehängt.quelle