如何在链的后期访问承诺的结果

时间:2016-10-21 10:35:29

标签: javascript asynchronous promise chaining

我有一个像这样的承诺链

functionOne()
.catch(errorHandlerOne)
.then(functionTwo)        // calls functionTwo(responseOne)
.catch(errorHandlerTwo)
.then(functionThree)      // calls functionThree(responseTwo)
.catch(errorHandlerThree)
.finally(finalHandler)

这似乎是一个明显的答案,但我的问题是:

我可以访问responseOne中的functionTwo(),但如何访问responseOnefunctionThree()中的finalHandler()

编辑:我考虑过将它分配给一个变量并稍后访问它,但它似乎非常hacky并且违背了promise链的流程。我正在寻找一种更好的方式

1 个答案:

答案 0 :(得分:1)

  

如何在functionThree()或finalHandler()中访问responseOne?

以某种方式向前传递它们,作为then回调的返回值(或它返回的promise的分辨率值,实际上是同样的事情)。

示例:

function asyncOp(name) {
  return new Promise(resolve => {
    resolve(name);
  });
}
asyncOp("one")
  .then(result1 => {
    return asyncOp("two")
      .then(result2 => [result1, result2]);
  })
  .then(results => {
    console.log("results", results);
  });

这样的数组只是一个选项;你可以使用一个对象,你可以将临时结果存储在处理程序关闭的变量中,......

ES5中的相同示例(以防有人需要):

function asyncOp(name) {
  return new Promise(function(resolve) {
    resolve(name);
  });
}
asyncOp("one")
  .then(function(result1) {
    return asyncOp("two")
      .then(function(result2) {
        return [result1, result2];
      });
  })
  .then(function(results) {
    console.log("results", results);
  });