异步函数中未发生代码执行

时间:2019-07-19 09:31:40

标签: javascript node.js

在以下代码中,最后一行不打印(“结束”):

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中进行良好的老式同步等待的好方法是什么?实际上,这个问题更多地是关于前者的问题。

1 个答案:

答案 0 :(得分:1)

不确定这是否是错字,但是您忘记了呼叫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();

关于您的问题:

  

您能解释一下不调用resolve会如何导致其余的   函数未执行?...

async await使用generatorspromise的行为:

  

异步/等待功能的目的是简化行为   同步使用promise并在组上执行某些行为   的承诺。正如承诺类似于结构化回调一样,   async / await类似于组合生成器和Promise。

生成器可以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的回调将不会运行。