promise构造函数是否需要解析函数



考虑以下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构造函数时需要调用resolvereject,否则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));

最新更新