Javascript NodeJs-控制器内部异步/等待

Javascript NodeJs-控制器内部异步/等待,javascript,node.js,async-await,ecmascript-2017,Javascript,Node.js,Async Await,Ecmascript 2017,我有这个简单的例子给我的控制器,并没有像预期的那样工作 export let create = async (req: Request, res: Response) => { console.log("START"); await setTimeout(() => { console.log("MIDDLE"); }, 1000); console.log("END"); return res.json({ data: null });

我有这个简单的例子给我的控制器,并没有像预期的那样工作

export let create = async (req: Request, res: Response) => {

   console.log("START");
   await setTimeout(() => {
      console.log("MIDDLE");
   }, 1000);
   console.log("END");
   return res.json({ data: null });

};
输出:开始、结束、中间

期望:开始、中间、结束

尝试:

wait new Promise(resolve=>setTimeout(resolve,1000))

试试:

wait new Promise(resolve=>setTimeout(resolve,1000))

您正在使用
setTimeOut
而没有创建promise对象,因此它正在等待
setTimeOut
值返回(这是即时的),而不是等待promise解析。这就是您的
await
语句无法按预期方式工作的原因。你需要的是做出承诺:

function resolveAfterOneSecond(x) { 
  return new Promise(resolve => {
    setTimeout(() => {
      console.log("Middle");
      resolve(x);
    }, 1000);
  });
}

async function f1() {
  var x = await resolveAfterOneSecond(10);
  console.log("End");
}

console.log("Begin");
f1();

然后将函数设置为等待承诺的返回,而不是setTimeOut函数整数的返回。

您使用的是
setTimeOut
,而没有创建承诺对象,因此它正在等待
setTimeOut
值的返回(这是即时的),而不是等待承诺解析。这就是您的
await
语句无法按预期方式工作的原因。你需要的是做出承诺:

function resolveAfterOneSecond(x) { 
  return new Promise(resolve => {
    setTimeout(() => {
      console.log("Middle");
      resolve(x);
    }, 1000);
  });
}

async function f1() {
  var x = await resolveAfterOneSecond(10);
  console.log("End");
}

console.log("Begin");
f1();

然后将函数设置为等待承诺的返回,而不是setTimeOut函数整数的返回。

您希望得到什么?我认为这很明显。。。。开始中间的END
setTimeout
返回一个数字,而不是承诺。只有当你等待承诺时,执行才会真正“等待”。你期望什么?我认为这是显而易见的。。。。开始中间的END
setTimeout
返回一个数字,而不是承诺。只有当您等待承诺时,执行才会真正“等待”。