我正在尝试通过以下方式实现两个承诺:
Promise.all([...])
但是他们都有自己的.then
:
Promise.all([promise1().then(...), promise2().then(...)])
我希望在Promise.all上再运行一个.then
,同时还要等待.then
都返回。
这是fiddle,说明我的意思。
答案 0 :(得分:1)
如果您运行
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)
是一个箭头函数,其名称为参数拒绝,但不返回任何内容。
答案 1 :(得分:0)
如果您想使用javascript中的异步操作,可以使用3种方法。
为了实现您想要的确切东西,最好和最优化的方法是使用async / await方法。
您可以这样做:
async function getAllData(){
const p1 = await promise1;
const p2 = await promise2;
}
现在getAllData返回Promise,您可以使用.then()获取结果,并使用.catch()获取错误。
要了解有关语法和其他功能的更多信息,请访问以下网站:explain about async and await