Javascript 我如何才能等待两个承诺完成,再运行另一个?
我正试图实现两个承诺:Javascript 我如何才能等待两个承诺完成,再运行另一个?,javascript,es6-promise,Javascript,Es6 Promise,我正试图实现两个承诺: Promise.all([…]) 但是他们都有自己的。然后: Promise.all([promise1().then(…),promise2().then(…])) 我希望在Promise.all上运行另一个。然后,同时等待这两个。如果有意义的话,然后返回 下面是一个演示我的意思的示例。如果您想在javascript中使用异步操作,有3种方法可以使用 回拨 允诺 异步/等待 为了实现您想要的东西,最佳和优化的方法是使用async/await方法 您可以这样做:
Promise.all([…])
但是他们都有自己的。然后:
Promise.all([promise1().then(…),promise2().then(…]))
我希望在Promise.all上运行另一个。然后
,同时等待这两个。如果有意义的话,然后
返回
下面是一个演示我的意思的示例。如果您想在javascript中使用异步操作,有3种方法可以使用
回拨
允诺
异步/等待
为了实现您想要的东西,最佳和优化的方法是使用async/await方法
您可以这样做:
async function getAllData(){
const p1 = await promise1;
const p2 = await promise2;
}
现在,您可以使用.then()获取结果,使用.catch()获取错误
要了解有关语法和其他功能的更多信息,您可以访问此网站:如果您运行
function get1() {
return new Promise((r)=>setTimeout(() => r(),3000))
}
function rejection() {/*Handle rejection*/}
function doAll(...ps) {
return Promise.all(ps.map(rejection))
}
(async () => {
var p1 = get1().then(()=>console.log("1"));
var p2 = get1().then(()=>console.log("2"));
Promise.all([p1, p2]).then(()=>{
console.log("3")
})
})()
那么结果是正确的
一,
二,
三,
然后你再次得到正确的答案
一,
二,
三,
因此,问题出在ps.map(拒绝)
的部分。让我们看看:
function get1() {
return new Promise((r)=>setTimeout(() => r(),3000))
}
function rejection() {/*Handle rejection*/}
function doAll(...ps) {
console.log(ps);
console.log(ps.map(rejection));
return Promise.all(ps.map(rejection));
}
(async () => {
var p1 = get1().then(()=>console.log("1"));
var p2 = get1().then(()=>console.log("2"));
doAll(p1, p2).then(()=>{
console.log("3")
})
})()
输出
两个元素的数组都是未定义的
,计算起来很简单。因为ps.map(拒绝)
是一个箭头函数,它命名其参数拒绝,并且不返回任何内容。最佳和优化的方法是使用async/await方法
不,不是。OP希望并行地执行承诺。wait以串行方式进行。将多个承诺组合成一个承诺,让我们假设您有p1,p2,p3,…,pn。如果等待p1,然后等待p2,然后等待pn,那么复杂度为O(p1+p2+…+pn)。但是,如果以并行方式运行它们,则复杂性为O(max(p1,p2,…,pn))。后者好得多。例如,2+8+16+15=41>16=max(2,8,16,15)。可能存在巨大的差异。我相信@AZ_想在他的评论中指出这一点。
function get1() {
return new Promise((r)=>setTimeout(() => r(),3000))
}
function rejection() {/*Handle rejection*/}
function doAll(...ps) {
console.log(ps);
console.log(ps.map(rejection));
return Promise.all(ps.map(rejection));
}
(async () => {
var p1 = get1().then(()=>console.log("1"));
var p2 = get1().then(()=>console.log("2"));
doAll(p1, p2).then(()=>{
console.log("3")
})
})()