当前位置: 首页 > 知识库问答 >
问题:

为什么这个JavaScript异步/等待代码不能像预期的那样运行?

谢海阳
2023-03-14

我尝试过阅读指南和教程来异步/等待,但我似乎找不到这个地址。

以下是相关代码:

    var func1 = new Promise((resolve, reject) => {
      console.log("Func1");
      setTimeout(() => {
        resolve(10);
      }, 100);
    });
    
    var func2 = new Promise((resolve, reject) => {
      console.log("Func2");
      setTimeout(() => {
        resolve(20);
      }, 5000);
    })
    
    let run = async() => {
      let var1 = await func1;
      let var2 = await func2;
      console.log(var1);
      console.log(var2);
    }

    run();

我们看到“Func1”和“Func2”立即一个接一个地打印出来。5秒后,即func2中指定的超时,我们将打印“10”和“20”。到现在为止,一直都还不错。

但是如果我把最后一点代码改成这样:

let run = async() => {
  let var1 = await func1;
  console.log(var1);
  let var2 = await func2;
  console.log(var2);
}

然后我看到“Func1”立即被打印出来,但是“Func2”也被打印出来,即使console.log(var1)在它前面。100毫秒后为“10”,5秒后为“20”。

来自MDN:

wait表达式导致异步函数执行暂停,直到promise得到满足或拒绝,并在满足后恢复异步函数的执行。

但事情似乎不是这样的。如果是,我们会看到“Func1”,然后是“10”,然后执行func2,从而打印“func2”,5秒后我们会得到“20”吗?func1应该被执行,一旦它被解析(在100毫秒内),console.log(var1)应该被激发。我错过了什么?

共有3个答案

皇甫俊雅
2023-03-14

await基本上意味着在继续之前可以使用以下值。promise在你创造它的时候就开始解决,等待它的时间并不重要。

鲜于子琪
2023-03-14

这里的主要问题是func1func2不是函数;它们是promise。正如Jonas W.所说,promise将调用其回调(解析,拒绝)=

您可以在此处看到所需的结果:

var func1 = () => {
   return new Promise((resolve, reject) => {
    console.log("Func1");
    setTimeout(() => {
      resolve(10);
    }, 100);
  });
}
        
var func2 = () => {
  return new Promise((resolve, reject) => {
    console.log("Func2");
    setTimeout(() => {
      resolve(20);
    }, 5000);
  });
}
        
let run = async() => {
  let var1 = await func1();
  let var2 = await func2();
  console.log(var1);
  console.log(var2);
}

run();

司徒兴思
2023-03-14

原因是您之前已经运行过您的promise执行者。当传递给Promise构造函数时,Promise执行程序会立即进行计算,因此您将获得以下结果:

var func1 = new Promise((resolve, reject) => ...); // Logs "Func1"
var func2 = new Promise((resolve, reject) => ...); // Logs "Func2"

let run = async() => {
  let var1 = await func1;
  console.log(var1); // Logs 10
  let var2 = await func2;
  console.log(var2); // Logs 20
}

run();
 类似资料:
  • 在主线程中初始化: 然后在奴隶身上,当它等待主人的时候,我会这样做: 奴隶必须在这里等待: 奴隶: 主人: 下面是我所看到的输出: -gt-

  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 然而,在我下面的代码中,我希望在这两个示例中都花费相同的15秒(每个任务5秒),如本文所述。然而,第二个示例只需要5秒,同时运行所有3个示例也需要5秒来完成第二个示例。原来的文章花了5秒,但我把它改成了1秒的延迟,让它更明显。 有没有人能解释一下这是怎么回事,为什么它看起来像线程一样运行?

  • 问题内容: 我正在使用Java和Selenium编写测试。我需要将另一个元素内的最后一个元素,所以我使用函数,但问题是,当我申请时,它并不总是带给我最后一个: 至 得到,它带给我: 但是当我将其应用于: 它带给我: 问题答案: 这是XPath混乱的常见原因。 首先是简单的部分: 选择文档中的所有元素。 选择文档中属于元素后代的所有元素。 到目前为止,正常的东西。 接下来是棘手的部分: 要在 兄弟姐

  • 为什么下面的失败? 测试的正确方法是什么?

  • 我正在创建一个简短的javafx程序,包含一个带有一些文本的标签和一个按钮,该按钮应该将标签的字体改为斜体。由于我使用的字体是自定义字体,所以我不能直接调用,因为javafx不能将自定义字体转换为斜体或粗体。 因此,我决定有两个不同的字体文件与相同的字体家族,其中一个有常规风格,另一个有斜体风格。因此,当单击斜体按钮时,程序将加载斜体字体文件,并将标签的字体设置为斜体字体。 但是当我尝试这个程序时