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

Nic*_*eda 3 javascript promise ecmascript-6 es6-promise

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

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);
  }
Run Code Online (Sandbox Code Playgroud)

所有承诺都是这样的函数:

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

    });

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试这个,它"有效",但我不确定这是不是我"假设"处理这样的事情.:)

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

注意:getFirstPromise来自我的代码中的不同模块.这不应该是问题的重要:)

T.J*_*der 5

假设这firstPromise实际上是一个承诺,但secondPromise实际上是返回承诺的函数,那么是的,你所做的就是你应该如何做到这一点.以下是Babel的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
Run Code Online (Sandbox Code Playgroud)

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


请注意catch上面的示例中的内容.除非你有充分的理由不这样做,否则一个承诺链应该总是有一个.catch如果你没有return结果.