承诺,传递额外的参数,然后链
承诺,只是例如
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参数访问数据? 如果有什么窍门? 谢谢。
你可以使用Function.prototype.bind
来创build一个传递给它的第一个参数的值,像这样
P.then(doWork.bind(null, 'text'))
你可以改变doWork
,
function doWork(text, data) { consoleToLog(data); }
现在, text
在doWork
实际上是'text'
, data
将是Promiseparsing的值。
注意:请确保您将拒绝处理程序附加到您的承诺链。
工作程序: 在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);
也许最直接的答案是:
P.then(function(data) { return doWork('text', data); });
或者,因为这是标记ecmascript-6
,使用箭头function:
P.then(data => doWork('text', data));
我觉得这是最可读的,而不是写太多。
Lodash为这个确切的事情提供了一个很好的select。
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
上下文。
使用咖喱。
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 );