Javascript 如何访问承诺中的承诺返回的值
是否可以访问承诺之外的result2的值。如果是,我该怎么做 范例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并行运行它们
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,哦,是的,你是对的。我感觉有些事情不对劲,但直到你提到才意识到。谢谢