Obietnica, na przykład:
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
Po wywołaniu metoda na obietnicy:
P.then(doWork('text'));
Funkcja doWork wygląda następująco:
function doWork(data) {
return function(text) {
// sample function to console log
consoleToLog(data);
consoleToLog(b);
}
}
Jak mogę uniknąć zwracania funkcji wewnętrznej w doWork, aby uzyskać dostęp do danych z obietnicy i parametrów tekstowych? Czy są jakieś sztuczki, aby uniknąć funkcji wewnętrznej?
javascript
promise
ecmascript-6
es6-promise
user3110667
źródło
źródło
bind
metody? - co również jest bardzo wolne.Odpowiedzi:
Możesz użyć
Function.prototype.bind
do stworzenia nowej funkcji z wartością przekazaną do jej pierwszego argumentu, w ten sposóbi możesz zmienić
doWork
na,Teraz
text
będzie'text'
w rzeczywistościdoWork
idata
będzie wartością ustaloną przez Obietnicę.Uwaga: upewnij się, że dołączasz moduł obsługi odrzucania do łańcucha obietnic.
Program roboczy: kopia na żywo na REPL Babel
źródło
call
wywołuje funkcję w miejscu,bind
tworzy nową funkcję, jednak oba akceptują kontekst wykonania jako pierwszy argument.Być może najprostsza odpowiedź brzmi:
Lub, ponieważ jest to oznaczone
ecmascript-6
, za pomocą funkcji strzałkowych:Uważam to za najbardziej czytelne i nie za dużo do pisania.
źródło
Użyj curry.
źródło
curriedDoWork
obietnicę, wykonującreturn new Promise()
w pierwszej linii tej funkcji, obietnica zostanie wykonana natychmiast po wywołaniucurriedDoWork()
(tak jak robisz to w..then(curriedDoWork('text'))
Lodash oferuje fajną alternatywę właśnie w tym przypadku.
Lub, jeśli chcesz, aby Twoja funkcja sukcesu miała tylko jeden parametr (spełnienie obietnicy), możesz wykorzystać ją w ten sposób:
Spowoduje to dołączenie
text: 'myArgString'
dothis
kontekstu w funkcji.źródło
Nową odpowiedzią na to pytanie jest użycie funkcji strzałkowych, które automatycznie wiążą „to” i są znacznie bardziej czytelne. Google dla linków, takich jak: https://2ality.com/2016/02/arrow-functions-vs-bind.html
Możesz ustawić tekst w następujący sposób: this.text = 'text' P.then (data => doWork (data)); //this.text wewnątrz doWork oceni jako „tekst”.
Sugeruje to jib powyżej i to (lub to!) Powinno być teraz akceptowaną odpowiedzią.
źródło