考虑以下promise数组
const promiseArray = [1, 2, 3].map(num =>
new Promise(async resolve => {
while (num > 0) {
await foo();
num--;
}
await bar(num);
resolve(); // No value to return
})
);
const a = Promise.all(promiseArray);
解析功能是否必要?
我们能省略它,把承诺变成这样吗?
const promiseArray = [1, 2, 3].map(num =>
new Promise(async () => {
while (num > 0) {
await foo();
num--;
}
await bar(num);
})
);
const a = Promise.all(promiseArray);
是的,使用new Promise
构造函数时需要调用resolve
或reject
,否则promise将保持挂起状态。
然而,在您的情况下,您根本不应该使用new Promise
:
const promiseArray = [1, 2, 3].map(async num => {
while (num > 0) {
await foo();
num--;
}
await bar(num);
});
const a = Promise.all(promiseArray);
我们能省略它并将promise变成这样吗?
不,不能。如果不调用resolve()
,您的new Promise()
将永远无法解析。当你打电话给:
const a = Promise.all(promiseArray);
promiseArray
中的任何承诺都不会得到解决。因此,承诺a
永远不会解决。所以,这些都没有任何用处,你也无法知道什么时候一切都完成了。
你似乎真的不需要在这里用承诺来包装任何东西。你可以这样做:
async function runLoop() {
for (let i = 1; i <= 3; i++) {
let num = i;
while (num > 0) {
await foo();
num--;
}
await bar(num); // note this will always be bar(0)
}
}
runLoop().then(() => {
console.log("all done");
}).catch(err => {
console.log(err);
});
或者,如果你想让单独的循环并行运行,你可以这样做:
const promiseArray = [1, 2, 3].map(async num => {
while (num > 0) {
await foo();
num--;
}
await bar(num); // note this will always be bar(0)
});
Promise.all(promiseArray).then(() => {
console.log("all done");
}).catch(err => {
console.log(err);
});
当您使用构造函数创建promise时,应该调用第一个参数来解析promise,应该调用函数的第二个参数(如果存在(来拒绝promise。如果您没有调用任何params,那么promise将始终处于挂起状态。更多信息
我认为您混淆了async/await和promise。
当您指定异步函数时,它将始终返回已解析的promise,除非您在函数内部抛出未捕获的错误。
例如:
async function hello(){ return 1}
hello().then((val) => console.log(val));
您可以使用promise 实现相同的示例
let promise = return new Promise((resolve) => return resolve(1));
promise.then((val) => console.log(val));