我的目标非常简单。我有一堆以各种顺序调用的异步实用程序函数。
对不对,就是这样:
doSomething(doNextThing(doFinalThing));
但它变得笨拙。我的目标是使用这样的语法:
doSomething.then(doNextThing).then(doFinalThing)
但能够更改订单:
doNextThing.then(doSomething).then(doFinalThing)
我将如何实现这些功能,以便它们都具有承诺意识?
答案 0 :(得分:1)
每个函数都需要返回一个在异步任务完成时完成的promise。查看许多现有的promise库之一。一个很好的是Q。
然后你将按顺序调用这些函数,如下所示:
var promiseForFinalResult = doSomething().then(doNextThing).then(doFinalThing);
假设每个函数只接受一个参数 - 前一个函数的结果。
使用“Q”doSomething()
的实现可能看起来像这样:
function doSomething() {
var D = Q.defer();
kickOffSomeAsyncTask(function(err, result) {
// this callback gets called when the async task is complete
if(err) {
D.fail(err);
return;
}
D.resolve(result);
});
return D.promise;
}
查看“Q”的文档。 Q.defer
的文档为located here,但您可能需要先读一些上述内容,然后才能直接进入延迟版。
答案 1 :(得分:0)
一般来说,在这种情况下你所做的是抽象的变量或函数参数的部分:
function chainStuff(first, second, third){
return first.then(second).then(thrid)
}
然后,您可以在运行时选择绑定到每个参数(第一,第二,第三)的回调
if(condition){
return chainStuff(doSomething, doNextThing, doFinalThing)
}else{
return chainStuff(doNextThing, doSomething, doFinalThing)
}