javascript - 异步函数中没有执行代码

标签 javascript node.js

<分区>

在下面的代码中,最后一行不打印('end'):

function setTimeoutSync(fn, milli) {
    return new Promise((resolve) => {
        setTimeout(fn, milli);
    });
}

async function run () {
    console.log('start');
    await setTimeoutSync(() => { console.log('setTimeoutSync'); }, 3000);
    console.log('end');
}

run();

这并不是脚本正在退出,因为我在 await 语句之后放置的任何内容都没有被执行。

NodeJS 怎么能不在函数中执行语句呢?另外,在 NodeJS 中进行老式同步等待的好方法是什么?这个问题实际上更多的是关于前者而不是后者。

最佳答案

不确定这是否是一个拼写错误,但您忘记调用 resolve 所以 await 之后的下一行将执行:

function setTimeoutSync(fn, milli) {
  return new Promise((resolve) => {
    setTimeout(() => {
      fn()
      resolve()
    }, milli);
  });
}

async function run() {
  console.log('start');
  await setTimeoutSync(() => {
    console.log('setTimeoutSync');
  }, 3000);
  console.log('end');
}

run();

关于你的问题:

Can you explain how not calling resolve can result in the rest of the function not executing?...

async await使用 generatorspromise行为:

The purpose of async/await functions is to simplify the behavior of using promises synchronously and to perform some behavior on a group of Promises. Just as Promises are similar to structured callbacks, async/await is similar to combining generators and promises.

发电机可以 yield结果因此不会终止执行上下文,并且可以在它停止的地方继续执行。

基本上你的例子可以写成Promise.prototype.then()回调:

function setTimeoutSync(fn, milli) {
  return new Promise((resolve) => {
    setTimeout(() => {
      fn()
      resolve()
    }, milli);
  });
}

async function run() {
  console.log('start');
  setTimeoutSync(() => {
    console.log('setTimeoutSync');
  }, 3000)
  .then((result) => {
  	console.log('end');
  });
  
}

run();

如您所见,如果我们不解析,则 .then 的回调将不会运行。

关于javascript - 异步函数中没有执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57109566/

相关文章:

javascript - Laravel 在向服务器发送 JSON 格式的 ISO 格式日期时提示 'trailing data'?

javascript - Google Chrome 中的 jQuery 问题?淡入淡出

javascript - 当前元素聚焦在 Owl Carousel 中时如何显示标题 div?

javascript - 将输入框中输入的文本显示到控制台

node.js - socket.io:客户端将所有传入消息接收到单个函数中

javascript - 在 Node.js 中,是否监听 EventEmitter,创建对它的引用?

javascript - 使用 JQuery 显示子菜单

node.js - 如何生成新进程并从 node.js 脚本退出?

python - 在 Visual Studio Code 中运行 Node.js,将 python 脚本作为子进程调用并调试它

javascript - 如何测量 javascript 字符串的大小?