Javascript promise构造函数是否需要resolve函数?
考虑下面的promise数组Javascript promise构造函数是否需要resolve函数?,javascript,ecmascript-6,promise,es6-promise,Javascript,Ecmascript 6,Promise,Es6 Promise,考虑下面的promise数组 const promiseArray=[1,2,3].map(num=> 新承诺(异步解析=>{ while(num>0){ 等待foo(); num--; } 等待条(num); resolve();//没有要返回的值 }) ); 常量a=Promise.all(promiseArray); 是否需要解析功能 我们可以省略它,把承诺变成这样吗 const promiseArray = [1, 2, 3].map(num => new Promise(a
const promiseArray=[1,2,3].map(num=>
新承诺(异步解析=>{
while(num>0){
等待foo();
num--;
}
等待条(num);
resolve();//没有要返回的值
})
);
常量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);
使用构造函数创建承诺时,应调用第一个参数来解析承诺,调用函数的第二个参数(如果存在)来拒绝承诺。如果您没有调用任何参数,那么promise将始终处于挂起状态 我认为您对异步/等待和承诺感到困惑 当您指定异步函数时,它将始终返回已解析的承诺,除非您在函数内部抛出未捕获的错误 例如:
async function hello(){ return 1}
hello().then((val) => console.log(val));
您可以使用承诺实现相同的示例
let promise = return new Promise((resolve) => return resolve(1));
promise.then((val) => console.log(val));
是,在使用
新承诺
构造函数时,需要调用解析
或拒绝
,否则承诺将保持挂起状态
但是,在您的情况下,您:
我们可以省略它,把承诺变成这样吗
const promiseArray = [1, 2, 3].map(num =>
new Promise(async () => {
while (num > 0) {
await foo();
num--;
}
await bar(num);
})
);
const a = Promise.all(promiseArray);
不,你不能。如果不调用resolve()
,您的new Promise()
将永远无法解析。当你打电话时:
const a = Promise.all(promiseArray);
promiseArray
中的任何承诺都无法解决。因此,承诺永远无法解决。所以,这些都没有任何用处,你也无法知道什么时候一切都完成了
看来你真的不需要在这里用承诺来包装任何东西。您可以这样做:
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);
});
! 因此,简化为
constapromise=foo(1,2,3)代码>或常量aPromise=Promise.resolve(foo(1,2,3))代码>。是否需要解析功能?-如果没有resolve
函数调用,aPromise
将永远无法实现。要实现它,您必须调用resolve
function好的,您试过了吗?等待批准
。您的第二个代码段将无法工作。如果foo返回一个承诺(如果您正在等待它,它必须返回),为什么要将其包装在另一个承诺中?感谢更新,但这里的“从不”实际上意味着从不。而你的第二个片段在你尝试它时仍然不起作用。事实上,我的情况涉及到不止一个承诺。请再核对一下这个问题。我已经更新了。谢谢:)同样的逻辑也适用于promise.all。你必须下定决心从promise.all获得结果,如果你不下定决心,你将承诺。all永远不会解决或拒绝它将始终处于挂起状态。我尝试过,但没有promise构造函数它无法工作。你能帮我查一下密码吗?我已经更新了答案。@Max这不是我答案中的代码。如果您正在执行其他操作,请使用实际代码。关于问题更新中的代码,如果您只想执行array.flat().forEach(console.log)
,则根本不应该使用承诺-没有异步!
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);
});