【问题标题】:Console log not printing in awaited promise in an async function控制台日志未在异步函数中打印等待的承诺
【发布时间】:2020-03-13 15:01:06
【问题描述】:

  function sleep(cb, ms) {
    return new Promise((cb) => setTimeout(cb, ms));
  }

  async function delayedGreeting() {
    console.log("Hello");
    await sleep(myfun, 1000);
    console.log("World!");
  }

  function myfun() {
    console.log("whatever");
  }

  delayedGreeting();
  console.log("Goodbye!");

有人可以在 Eventloop、Callback Queue 和 Stack 的上下文中解释这里发生了什么,因为我在输出中没有看到“whatever”这个词。代码中是否有错误,如果有,是什么错误?

【问题讨论】:

  • 请在问题中添加 javascript 标签。

标签: javascript async-await es6-promise


【解决方案1】:

您忘记在此行await sleep(myfun, 1000); 上为myfun 函数参数添加括号。

演示

  function sleep(cb, ms) {
    return new Promise((cb) => setTimeout(cb, ms));
  }

  async function delayedGreeting() {
    console.log("Hello");
    await sleep(myfun(), 1000);
    console.log("World!");
  }

  function myfun() {
    console.log("whatever");
  }

  delayedGreeting();
  console.log("Goodbye!");

【讨论】:

  • myfun() 会在 1000 毫秒超时之前执行函数,这是错误的。而不是那里,括号应该在cb()中。
【解决方案2】:

代码中有一些小错误。我将它们指向下方。

  1. 你应该在 Promise 中写下 resolve。
return new Promise((resolve) => resolve (setTimeout(()=>{cb()}, ms)));
  1. 如果你想让myfun在1000毫秒超时后运行,你必须调用settimeout第一个参数中的函数。像这样,
setTimeout(()=>{cb()}, ms);

这里是更新的源代码,

      function sleep(cb, ms) {
        return new Promise((resolve) => resolve (setTimeout(()=>{cb()}, ms)));
      }

      async function delayedGreeting() {
        console.log("Hello");
        await sleep(myfun, 1000);
        console.log("World!");
      }

      function myfun() {
        console.log("whatever");
      }

      delayedGreeting();
      console.log("Goodbye!");

根据您正在尝试代码的实现,正确的输出应该是这样的,

Hello
Goodbye!
World!
whatever

【讨论】:

  • 我可以知道为什么Goodbye! 打印在World! 之前吗?
  • 因为等待。
【解决方案3】:

你应该这样尝试 -

function sleep(cb, ms) {
    return new Promise((resolve) => resolve(setTimeout(cb, ms)));

  }

看来您正在覆盖承诺中的 cb 值。

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 2020-11-19
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多