承诺,传递额外的参数,然后链

承诺,只是例如

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); } 

现在, textdoWork实际上是'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 );