【问题标题】:how do I access a value returned by a promise inside promise如何访问由 promise 内部的 promise 返回的值
【发布时间】:2018-11-14 16:37:49
【问题描述】:

是否可以在 promise 之外访问 result2 的值。如果是,我该怎么做

例子

someFile1.someFunction1(req).then((result1)=>{
.
.
.
.

    someFile2.someFunction2(req).then((result2)={
        return(result2);
    });

    return(result1+result2);

})

【问题讨论】:

  • 恐怕您展示的代码太零碎,我们无法理解您的真实代码是如何设置的。请更新示例以显示您的真实情况(但仍然很少,请参阅帮助中的this topic 了解更多信息)。
  • 你可以使用 Promise.all 来实现这个结果。 Promise.all 等到所有的 Promise 都解决后,然后返回所有已解决的 Promise 的结果。
  • @enf0rcer - 也许吧。我认为它们嵌套是有原因的。但是,如果他们不是,是的,那将是要走的路。
  • 我在类似于Promise.all 的帖子上写了一个函数,它按顺序运行承诺。试试看。 stackoverflow.com/questions/53275216/…

标签: javascript node.js


【解决方案1】:

注意:我假设它们嵌套是有原因的。否则,请使用Promise.all 并行运行它们,并将解析时收到的数组相加。

如果我假设您的代码确实大部分如图所示,.s 不会引入太多复杂性,有几种方法,但可能该示例中最简单的方法是嵌套 promise 处理程序:

someFile1.someFunction1(req)
.then((result1) => {
    return someFile2.someFunction2(req)
        .then((result2) => {
            return result1 + result2;
        });
})
.then(combined => {
    // Use the combined result
});

或使用简洁的箭头函数:

someFile1.someFunction1(req)
.then(result1 =>
    someFile2.someFunction2(req).then(result2 => result1 + result2)
)
.then(combined => {
    // Use the combined result
});

当然,也可以使用async 函数和await

const result1 = await someFile1.someFunction1(req);
const result2 = await someFile2.someFunction2(req);
const combined = result1 + result2;

甚至

const combined = (await someFile1.someFunction1(req)) + (await someFile2.someFunction2(req));

【讨论】:

  • 也使用Promise.all 怎么样??
  • 我认为 Promise.all 在这种情况下更容易使用。
  • @ShashankVivek - 如果它们不相互依赖(我认为它们是嵌套的),是的,这将是一个很好的解决方案并且意味着它们可以并行运行。如果我是你陈述这个假设,我会发布一个答案。
【解决方案2】:

不,这是不可能的,因为在return 语句的这一点上,Promise 可能尚未解决,因为它是异步的。您可以做的是通过利用Promise.all 返回另一个处理其他两个结果的 Promise。只有当 promise2 不需要嵌套在 promise1 中时,此解决方案才有效。如果确实需要嵌套,请查看 T.J. 的解决方案。克劳德。

function combinePromises() {
  var promise1 = Promise.resolve(3);
  var promise2 = Promise.resolve(42);

  var promise3 = Promise.all([promise1, promise2]).then(([result1, result2]) => result1 + result2);
  return promise3;
}
var resultPromise = combinePromises();
resultPromise.then(finalResult => console.log(finalResult));

【讨论】:

    【解决方案3】:

    您始终可以将异步函数作为 Promise 回调传递:

    const doSomething = function(someData) = {
      return new Promise(async (resolve, reject) => {
        try {
          const result1 = await somePromise(someData);
          const result2 = await someOtherPromise(result1);
    
          resolve(result1 + result2);
        } catch (ex) {
          reject(ex);
        }
      });
    };
    

    【讨论】:

    • new Promise(async ... 是一种反模式。 async 函数创建了 Promise,因此它只是创建了一个额外的 Promise 层并添加了尴尬的 try/catch。上面的更简单的版本是:const doSomething = (async() => (await somePromise('someData')) + (await someOtherPromise(result1, 'someOtherData')))(); 做同样的事情(包括错误处理),但没有额外的层和笨拙的结构。
    • @T.J.Crowder,哦,是的,你是对的。我感觉有些不对劲,但直到你提到我才意识到。谢谢
    猜你喜欢
    • 2020-05-26
    • 2017-10-25
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2019-07-01
    相关资源
    最近更新 更多