在Promise链中间传递一个额外的参数

时间:2015-11-16 10:18:07

标签: javascript promise ecmascript-6 es6-promise

我需要在promise链中间放入一个userID param(这是唯一需要它的承诺)。所有承诺都应该以同步顺序执行。

SideNote- stackoverflow上的所有类似示例都有点不同 - 比如使用lambda函数(我使用声明的函数)。所以我还是不太确定。

var initialize = function(userID) {
      var firstPromise = Module2.getFirstPromise();
          firstPromise.then(getSecondPromise)
         .then(getThirdPromise)                     
         .then(getFourthPromise)  //<----Fourth promise needs userID
         .then(getFifthPromise)
         .then(Utils.initializeComplete);
  }

所有承诺都是这样的功能:

var thirdPromise = function() {
   return new Promise(function(resolve, reject) {
      //fetch data
        //On Return, Store it
         resolve() //Nothing needed to passed down from this promise
      });

    });

}

我正在尝试这个,并且它已经工作了#34;但是我不确定这是不是我的样式&#34;假设&#34;处理这样的事情。 :)

var initialize = function(userID) {
      var firstPromise = Module2.getFirstPromise();
          firstPromise.then(getSecondPromise)
         .then(getThirdPromise)                     
         .then(function(){ return fourthPromise(userID)})
         .then(getFourthPromise)
         .then(Utils.initializeComplete);
  }

注意:getFirstPromise来自我的代码中的其他模块。尽管如此,这不应该对这个问题很重要:)

3 个答案:

答案 0 :(得分:5)

假设firstPromise实际上是一个承诺,但是secondPromise等等实际上是返回承诺的函数,那么是的,你所做的就是你应该怎么做要做到这一点。 Here's a live example on Babel's REPL,如下所示:

function doSomething(userID) {
  getFirstPromise()
    .then(getSecondPromise)
    .then(getThirdPromise)
    .then(() => getFourthPromise(userID))
    // Or .then(function() { return getFourthPromise(userID); })
    .then(getFifthPromise)
    .catch(err => {
      console.log("Error: " + err.message);
    });
}
doSomething("foo");
function getFirstPromise() {
  console.log("getFirstPromise called");
  return new Promise(resolve => {
    setTimeout(() => {
      resolve("one");
    }, 0);
  });
}
// and then second, third, fourth (with user ID), and fifth

(如果您不使用箭头功能,只需将其替换为function表格。)

请注意上面示例中的catch。除非你有非常好的理由不,否则如果你没有.catch结果,则承诺链应始终为return

答案 1 :(得分:4)

你的解决方案非常好。使用具体的签名可能更容易理解。

如果您的thirdPromise没有采取任何行动并且不返回任何内容,则可能会写入其签名(伪代码假定a -> b是a到b的函数)_ -> Promise (_)。如果它返回某个值a,则为_ -> Promise (a)。如果它花了一些东西并返回了一些东西,它可能是a -> Promise (b)

因此,你可以推断你的承诺链,就像获取一些价值的函数一样,并返回包含在promise中的其他值。但是,您的fourthPromise看起来有所不同:

fourthPromise : UserId -> a -> Promise (b)

可以写成:

fourthPromise : UserId -> (a -> Promise (b))

在成为您可以链接的实际承诺之前需要一个参数。在某种程度上,它是一个承诺的模板。

答案 2 :(得分:0)

如果你想在main函数中使用普通#category3链,请尝试将getFourthPromise编写为工厂函数

.then

然后您将获得function getSomethingByUserID(userId) { return function() { return new Promise(function(resolve) { //your actual async job resolve('a result'); }); }; } s

的计划清单
then

不要忘记,如果您错过向 var firstPromise = Module2.getFirstPromise() .then(getSecondPromise) .then(getSomethingByUserID(userId)) .then(Utils.initializeComplete); 提供userId,则无效。