繁体   English   中英

我如何访问Promise中的Promise返回的值

[英]how do I access a value returned by a promise inside promise

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

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

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

    return(result1+result2);

})

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

如果我假设您的代码实际上基本上如图所示,则该. 不会带来太多的复杂性,有两种方法,但是该示例中最简单的方法可能是仅嵌套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));

不,这是不可能的,因为在return语句的位置,Promise可能尚未解决,因为它是异步的。 您可以做的是利用Promise.all返回另一个处理其他两个结果的Promise.all 仅当promise2不需要嵌套在promise1中时,此解决方案才有效。 如果确实需要嵌套,请查看TJ Crowder提供的解决方案。

 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)); 

您始终可以将异步函数作为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);
    }
  });
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM