如何在可以按各种顺序调用的函数中使用 promise

How to use promises in functions that can be called in various orders?

本文关键字:函数 promise 顺序调用      更新时间:2023-09-26

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

对不是这样的:

doSomething(doNextThing(doFinalThing));

但它正变得笨拙。我的目标是拥有这样的语法:

doSomething.then(doNextThing).then(doFinalThing)

但具有更改订单的能力:

doNextThing.then(doSomething).then(doFinalThing)

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

每个函数都需要返回一个承诺,该承诺在其异步任务完成时完成。 查看众多现有的承诺库之一。 一个优秀的是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的文档位于此处,但在直接进入延迟之前,您可能需要阅读上述一些内容。

通常,在这种情况下,您所做的是抽象化为变量或函数参数的部分:

function chainStuff(first, second, third){
   return first.then(second).then(thrid)
}

然后,您可以在运行时选择绑定到每个参数的回调(第一个、第二个、第三个)

if(condition){
    return chainStuff(doSomething, doNextThing, doFinalThing)
}else{
    return chainStuff(doNextThing, doSomething, doFinalThing)
}