Promises, передать дополнительные параметры для последующей цепи
например,
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, чтобы получить доступ к данным с обещанием и параметром текста? если есть какие-то трюки? спасибо.
Ответы
Ответ 1
Вы можете использовать Function.prototype.bind
для создания новой функции со значением, переданным ее первому аргументу, например
P.then(doWork.bind(null, 'text'))
и вы можете изменить doWork
на,
function doWork(text, data) {
consoleToLog(data);
}
Теперь text
будет фактически 'text'
в doWork
, а data
будет значением, разрешенным обещанием.
Примечание.. Убедитесь, что вы прикрепляете обработчик отклонения к вашей цепочке обещаний.
Рабочая программа: Живая копия на Babel 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);
Ответ 2
Возможно, самый простой ответ:
P.then(function(data) { return doWork('text', data); });
Или, поскольку это помечено ecmascript-6
, используя функции стрелок:
P.then(data => doWork('text', data));
Я нахожу это наиболее читаемым и не слишком много для написания.
Ответ 3
Lodash предлагает приятную альтернативу для этой точной вещи.
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
внутри функции.
Ответ 4
Используйте 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
);