承诺,例如:
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参数中访问数据?是否有任何技巧来避免内在功能?
答案 0 :(得分:92)
也许最直截了当的答案是:
P.then(function(data) { return doWork('text', data); });
或者,因为它使用箭头函数标记为ecmascript-6
:
P.then(data => doWork('text', data));
我发现这个最具可读性,而且写的不多。
答案 1 :(得分:75)
您可以使用Function.prototype.bind
创建一个新函数,并将值传递给第一个参数,如下所示
P.then(doWork.bind(null, 'text'))
您可以将doWork
更改为
function doWork(text, data) {
consoleToLog(data);
}
现在,text
'text'
实际上doWork
data
,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);
将是Promise解决的值。
注意:请确保将拒绝处理程序附加到您的承诺链。
工作计划: Live copy on Babel's REPL
{{1}}
答案 2 :(得分:3)
使用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
);
答案 3 :(得分:0)
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 :(得分:0)
此问题的新答案是使用箭头功能(自动绑定this
并且可读性更强)。 Google提供的链接,例如:
https://2ality.com/2016/02/arrow-functions-vs-bind.html
您可以将文本设置为:
this.text = 'text';
P.then(data => doWork(data));
注意:this.text
内的doWork
将评估为“文本”。
上面的臂架建议这样做,并且(或!)现在应该是可以接受的答案。
答案 5 :(得分:0)
使用它以便您可以访问承诺正文中的全局变量
var ref=this;
示例
p.then((data)=>{
var ref=this;
});