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

一个承诺,举个例子:

var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});

在我们按照承诺调用 .then()方法之后:

P.then(doWork('text'));

然后 doWork函数看起来像这样:

function doWork(data) {
return function(text) {
// sample function to console log
consoleToLog(data);
consoleToLog(b);
}
}

如何避免在 doWork 中返回一个内部函数,以便能够访问承诺参数和文本参数中的数据?有什么技巧可以避免内部功能?

121430 次浏览

您可以使用 Function.prototype.bind创建一个新函数,该函数的值传递给它的第一个参数,如下所示

P.then(doWork.bind(null, 'text'))

你可以把 doWork改成,

function doWork(text, data) {
consoleToLog(data);
}

现在,text将实际上是 doWork中的 'text',而 data将是承诺所解决的值。

注意: 请确保您在承诺链上附加了拒绝处理程序。


@ A% 20% 20.then (doWork.bind (null% 2C% 20 & # 39; text & # 39;))% 0A% 20% 20.catch (console.error)% 3B”rel = “ noReferrer”> 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));

我觉得这本书最易读,写起来也不会太多。

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上下文。

用咖喱。

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

这个问题的新答案是使用箭头函数 (which automatically bind the this and are much more readable): Https://2ality.com/2016/02/arrow-functions-vs-bind.html

你可以这样设置文本:

this.text = 'text';
P.then(data => doWork(data));

注意: doWork中的 this.text将计算为“文本”。

This is suggested by jib above and that (or this!) should be the accepted answer now.

use this so you can access global variable inside the promise body

var ref=this;

例子

p.then((data)=>{
var ref=this;
});