Obietnic, przekazać dodatkowe parametry do łańcucha
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 metody na obietnicy:
P.then(doWork('text'));
Funkcja DoWork wygląda tak:
function doWork(data) {
return function(text) {
// sample function to console log
consoleToLog(data);
consoleToLog(b);
}
}
Jak uniknąć funkcji wewnętrznej w doworku, aby uzyskać dostęp do danych z parametru promise I text? jeśli są jakieś sztuczki? dzięki.
4 answers
Możesz użyć Function.prototype.bind
aby utworzyć nową funkcję z wartością przekazaną do jej pierwszego argumentu, jak to
P.then(doWork.bind(null, 'text'))
I możesz zmienić doWork
na,
function doWork(text, data) {
consoleToLog(data);
}
Teraz text
będzie faktycznie 'text'
W doWork
i data
będzie wartością ustaloną przez obietnicę.
Uwaga: upewnij się, że dołączasz funkcję obsługi odrzucenia do łańcucha obietnic.
Program roboczy: Live copy on Babel ' s REPL
function doWork(text, data) {
console.log(text + data + text);
}
new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function () {
resolve(a);
}, 3000);
} else {
reject(a);
}
})
.then(doWork.bind(null, 'text'))
.catch(console.error);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-12 12:57:46
Być może najprostsza odpowiedź brzmi:
P.then(function(data) { return doWork('text', data); });
Lub, ponieważ jest to oznaczone ecmascript-6
, za pomocą funkcji strzałek:
P.then(data => doWork('text', data));
Uważam to za najbardziej czytelne i nie za dużo do napisania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-05 00:15:43
Użyj currying.
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
var curriedDoWork = function(text) {
return function(data) {
console.log(data + text);
}
};
P.then(curriedDoWork('text'))
.catch(
//some error handling
);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-22 10:53:28
Lodash oferuje miłą alternatywę dla tej właśnie rzeczy.
P.then(_.bind(doWork, 'myArgString', _));
//Say the promise was fulfilled with the string 'promiseResults'
function doWork(text, data) {
console.log(text + " foo " + data);
//myArgString foo promiseResults
}
Lub, jeśli chcesz, aby Twoja funkcja sukcesu miała tylko jeden parametr( spełnione wyniki obietnicy), możesz użyć go w ten sposób:
P.then(_.bind(doWork, {text: 'myArgString'}));
function doWork(data) {
console.log(data + " foo " + this.text);
//promiseResults foo myArgString
}
To dołączy {[2] } do kontekstu this
w ramach funkcji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-19 20:00:50