控制台日志未在异步函数中等待的承诺中打印

Console log not printing in awaited promise in an async function

  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'。代码中是否有错误,如果有错误是什么?

你应该这样尝试 -

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

  }

您似乎覆盖了 promise 中的 cb 值。

您忘记在 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!");

代码中有一些小错误。我在下面指出它们。

  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