如何解决我如何等待2个诺言完成,再执行另一个诺言?
我正在尝试通过以下方式实现两个承诺:
Promise.all([...])
但是他们都有自己的.then
:
Promise.all([promise1().then(...),promise2().then(...)])
我希望在Promise.all上再运行一个.then
,同时还要等待.then
都返回。
这是fiddle,说明我的意思。
解决方法
如果您运行
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")
})
})()
那么结果是正确的
1
2
3
If you run
function get1() {
return new Promise((r)=>setTimeout(() => r(),3000))
}
function rejection() {/*Handle rejection*/}
function doAll(...ps) {
return Promise.all(ps)
}
(async () => {
var p1 = get1().then(()=>console.log("1"));
var p2 = get1().then(()=>console.log("2"));
doAll(p1,p2).then(()=>{
console.log("3")
})
})()
然后您再次获得正确的
1
2
3
结果,问题出在ps.map(rejection)
的一部分上。让我们看看:
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")
})
})()
输出
两个元素均为undefined
的数组很容易评估。因为ps.map(rejection)
是一个箭头函数,其名称为参数拒绝,但不返回任何内容。
如果您想使用javascript中的异步操作,可以使用3种方法。
- 回调
- 承诺
- 异步/等待
为了实现您想要的确切东西,最好和最优化的方法是使用async / await方法。
您可以这样做:
async function getAllData(){
const p1 = await promise1;
const p2 = await promise2;
}
现在getAllData返回Promise,您可以使用.then()获取结果,并使用.catch()获取错误。
要了解有关语法和其他功能的更多信息,请访问以下网站:explain about async and await
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。