Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript promise构造函数是否需要resolve函数?_Javascript_Ecmascript 6_Promise_Es6 Promise - Fatal编程技术网

Javascript promise构造函数是否需要resolve函数?

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

考虑下面的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(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);
});