use*_*667 89 javascript promise ecmascript-6 es6-promise
承诺,例如:
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
Run Code Online (Sandbox Code Playgroud)
在我们调用之后,那么承诺上的方法:
P.then(doWork('text'));
Run Code Online (Sandbox Code Playgroud)
doWork函数如下所示:
function doWork(data) {
return function(text) {
// sample function to console log
consoleToLog(data);
consoleToLog(b);
}
}
Run Code Online (Sandbox Code Playgroud)
如何避免在doWork中返回内部函数,以获取promise和text参数中的数据?避免内在功能有什么技巧吗?
jib*_*jib 97
也许最直截了当的答案是:
P.then(function(data) { return doWork('text', data); });
Run Code Online (Sandbox Code Playgroud)
或者,因为这是标记的ecmascript-6,使用箭头功能:
P.then(data => doWork('text', data));
Run Code Online (Sandbox Code Playgroud)
我发现这个最具可读性,而且写得不多.
the*_*eye 81
您可以使用Function.prototype.bind创建一个新函数,并将值传递给第一个参数,如下所示
P.then(doWork.bind(null, 'text'))
Run Code Online (Sandbox Code Playgroud)
你可以换doWork到
function doWork(text, data) {
consoleToLog(data);
}
Run Code Online (Sandbox Code Playgroud)
现在,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);
Run Code Online (Sandbox Code Playgroud)
小智 5
使用柯里化。
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
);
Run Code Online (Sandbox Code Playgroud)