javascript - 如何访问链后面部分的 promise 结果

标签 javascript asynchronous promise chaining

我有一个像这样的 promise 链

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

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

我可以访问 responseOnefunctionTwo()很好,但是我怎样才能访问 responseOnefunctionThree()finalHandler()

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

最佳答案

how can I access the responseOne in functionThree() or finalHandler()?

通过以某种方式将它们向前传递,作为 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);
  });

关于javascript - 如何访问链后面部分的 promise 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40174411/

相关文章:

Javascript - 检查对象属性存在时避免异步竞争条件

c# - ReceiveAsync 与 BeginReceive 的性能

javascript - 为什么sequelize.findOne() 没有返回结果,而我可以看到结果在我的数据库中

javascript - 与 promise then function 混淆

javascript - 这种情况的正则表达式是什么?

javascript - 如何使用 javascript 传递用户名和密码调用 WCF 服务

javascript - MS Graph API 使用 LookupId 从一个列表到另一个列表

javascript - 使用 html 5 async 属性异步加载脚本

mysql - Restify:使用 promise 链复制文件和查询数据库时发生套接字挂起错误

javascript - 使用数组在node.js中顺序执行