Обещает, передать дополнительные параметры для последующей цепочки
обещаю, просто например
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
после того, как мы вызовем тогда метод на обещание:
P.then(doWork('text'));
функция doWork выглядит так:
function doWork(data) {
return function(text) {
// sample function to console log
consoleToLog(data);
consoleToLog(b);
}
}
как я могу избежать внутренней функции в doWork, чтобы получить доступ к данным из параметра promise и text? если есть какие-то хитрости? спасибо.
4 ответа:
можно использовать
Function.prototype.bind
чтобы создать новую функцию со значением, переданным в ее первый аргумент, напримерP.then(doWork.bind(null, 'text'))
и вы можете изменить
doWork
в,function doWork(text, data) { consoleToLog(data); }
теперь
text
будет'text'
наdoWork
иdata
будет значение, разрешенное обещанием.Примечание: пожалуйста, убедитесь, что вы прикрепляете обработчик отклонения к цепочке обещаний.
рабочая программа: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);
пожалуй, самый простой ответ:
P.then(function(data) { return doWork('text', data); });
или, так как это тегами
ecmascript-6
, используя стрелки функции:P.then(data => doWork('text', data));
Я нахожу это наиболее читаемым, и не слишком много, чтобы писать.
использовать карринг.
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 );
Лодаш предлагает хорошую альтернативу для этой точной вещи.
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 }
или, если вы хотите, чтобы ваша функция успеха имела только один параметр (выполненные результаты обещания), вы можете использовать его следующим образом:
P.then(_.bind(doWork, {text: 'myArgString'})); function doWork(data) { console.log(data + " foo " + this.text); //promiseResults foo myArgString }
это приложит
text: 'myArgString'
доthis
контекст внутри функции.