如何在可以在各种命令中调用的函数中使用promises?

时间:2013-09-08 03:42:50

标签: javascript promise

我的目标非常简单。我有一堆以各种顺序调用的异步实用程序函数。

对不对,就是这样:

doSomething(doNextThing(doFinalThing));

但它变得笨拙。我的目标是使用这样的语法:

doSomething.then(doNextThing).then(doFinalThing)

但能够更改订单:

doNextThing.then(doSomething).then(doFinalThing)

我将如何实现这些功能,以便它们都具有承诺意识?

2 个答案:

答案 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)
}