Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.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 等待而不是等待?_Javascript_Asynchronous_Promise - Fatal编程技术网

Javascript 等待而不是等待?

Javascript 等待而不是等待?,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我有多个异步函数,我想一个接一个地执行,但是下一个函数是在前一个函数完成之前执行的 async function x() { for (...) { console.log("awaiting" + i) function fooPromise() { return new Promise(function(resolve) { foo(); resolve(); }); } awai

我有多个异步函数,我想一个接一个地执行,但是下一个函数是在前一个函数完成之前执行的

async function x() {
  for (...) {
    console.log("awaiting" + i)
    function fooPromise() {
      return new Promise(function(resolve) {
        foo();
        resolve();
      });
    }
    await fooPromise();
    console.log("awaited" + i)
  }
}
async foo(){
  for(...){
     await sleep(1500);    
  }    
  console.log("finished");
}
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
预期产出应为:

等待1
已完成
等待1
等待2
已完成
等待2
等待3
已完成
等待3

但我得到的是:

等待1
等待1
等待2
等待2
等待3
等待3
已完成
已完成
完成

我对使用Promissions和async还比较陌生,所以如果有任何帮助,我将不胜感激

return new Promise(function(resolve) {
   foo();
   resolve();
});
传递给promise构造函数的代码立即同步运行。构造函数通常用于获取使用回调编写的代码,然后将回调包装成承诺(如您的示例中所示)

因此,此代码将立即调用foo,忽略由
foo
返回的承诺,然后立即解析新承诺。事实上,
foo
以后做事情对这个承诺没有影响

因为
foo
已经返回了一个承诺(因为它是一个异步函数),所以没有必要将它包装成一个新的承诺。您可以将代码更改为:

异步函数x(){
for(设i=1;i该
函数fooPromise()的意义是什么){
以及它所构造的承诺?是的,这仍然像以前一样给出了错误的输出真的吗?我已经将它编辑成一个片段,并且它输出了我运行它时您所要求的内容。@TDUK运行答案中的代码片段,看看它是如何工作的。您确定在自己的代码中尝试此操作时没有忘记
等待
吗?应该提到这一点,但有多个睡眠,而不仅仅是一个,如果这改变了任何东西,只要等待它们,就没有其他改变,只会让它花费更长的时间。我编辑了我的代码片段,每个foo包含两个睡眠,输出仍然是您所要求的。