Javascript 如何访问承诺中的承诺返回的值

Javascript 如何访问承诺中的承诺返回的值,javascript,node.js,Javascript,Node.js,是否可以访问承诺之外的result2的值。如果是,我该怎么做 范例 someFile1.someFunction1(req).then((result1)=>{ . . . . someFile2.someFunction2(req).then((result2)={ return(result2); }); return(result1+result2); }) 注意:我假设它们嵌套是有原因的。否则,请使用Promise.all并行运行它们

是否可以访问承诺之外的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
函数和
wait

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处理程序:

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
函数和
wait

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

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

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

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

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

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

函数组合promises(){
var promise1=承诺。解决(3);
var promise2=承诺。解决(42);
var promise3=承诺。所有([promise1,promise2])。然后([result1,result2])=>result1+result2);
返还承诺书3;
}
var resultPromise=combinePromises();

resultPromise.then(finalResult=>console.log(finalResult))否这是不可能的,因为在
return
语句中,承诺可能尚未解决,因为它是异步的。您可以做的是返回另一个承诺,通过利用
Promise.all
处理另外两个承诺的结果。仅当promise2不需要嵌套在promise1中时,此解决方案才有效。如果确实需要嵌套,请查看T.J.Crowder的解决方案

函数组合promises(){
var promise1=承诺。解决(3);
var promise2=承诺。解决(42);
var promise3=承诺。所有([promise1,promise2])。然后([result1,result2])=>result1+result2);
退回承诺人3;
}
var resultPromise=combinePromises();

resultPromise.then(finalResult=>console.log(finalResult))恐怕您展示的代码太零碎,我们无法理解您真正的代码是如何设置的。请更新示例以显示您的真实情况(但仍然很小,更多信息请参见帮助中)。您可以使用Promise.all来实现此结果。Promise.all等待所有承诺得到解决,然后将返回所有已解决承诺的结果。@enf0rcer-可能。我认为它们被嵌套是有原因的。如果他们不是,是的,那就是正确的做法。我在一篇帖子上写了一个函数,类似于
Promise。所有的
都按顺序运行promises。试试看。恐怕您展示的代码太零碎,我们无法理解您真正的代码是如何设置的。请更新示例以显示您的真实情况(但仍然很小,更多信息请参见帮助中)。您可以使用Promise.all来实现此结果。Promise.all等待所有承诺得到解决,然后将返回所有已解决承诺的结果。@enf0rcer-可能。我认为它们被嵌套是有原因的。如果他们不是,是的,那就是正确的做法。我在一篇帖子上写了一个函数,类似于
Promise。所有的
都按顺序运行promises。试试看。还可以使用
Promise.all
?我认为Promise.all在这种情况下更容易使用。@ShashankVivek-如果它们彼此不依赖(我假设它们嵌套是有原因的),是的,这将是一个很好的解决方案,意味着它们可以并行运行。如果我是你的话,我会发布一个答案。也使用
Promise.all
?我认为Promise.all在这种情况下更容易使用。@ShashankVivek-如果它们不相互依赖(我假设它们嵌套是有原因的),是的,这将是一个很好的解决方案,意味着它们可以并行运行。如果我是你,我会给出一个答案。
newpromise(async…
是一种反模式。
async
函数创建承诺,所以它只是创建了一个额外的承诺层,并添加了笨拙的
try
/
catch
。上面的简单版本是:
constdosomething=(async()=>(wait somePromise('someData'))+(wait someOtherPromise(result1,'someOtherData'))();
做同样的事情(包括错误处理),但没有额外的层和笨拙的结构。@T.J.Crowder,哦,是的,你是对的。我感觉有些事情不对劲,但直到你提到我才意识到。谢谢
新承诺(async…
是一种反模式。
async
函数创建承诺,因此它只创建了一个额外的承诺层,并添加了一个笨拙的
try
/
catch
。上面的简单版本是:
const doSomething=(async()=>(wait somePromise('someData'))+(wait someOtherPromise(result1,'someOtherData'))();
做同样的事情(包括错误处理),但没有额外的层和笨拙的结构。@T.J.Crowder,哦,是的,你是对的。我感觉有些事情不对劲,但直到你提到才意识到。谢谢