NodeJs - 控制器内的异步/等待[重复]

Posted

技术标签:

【中文标题】NodeJs - 控制器内的异步/等待[重复]【英文标题】:NodeJs - Async/Await inside controller [duplicate] 【发布时间】:2018-06-08 04:45:14 【问题描述】:

我的控制器有这个简单的例子,但没有按预期工作

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 );

;

输出:开始、结束、中间

期望:开始、中间、结束

【问题讨论】:

你期待什么? 我觉得很明显.... START... MIDDLE... END setTimeout 返回一个数字,而不是一个承诺。只有当你 await 承诺时,执行才会真正“等待”。 【参考方案1】:

尝试:

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

【讨论】:

【参考方案2】:

您正在使用 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();

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

【讨论】:

以上是关于NodeJs - 控制器内的异步/等待[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Sails.js 控制器等待异步服务方法

异步/等待行为问题[重复]

nodejs异步调用async

nodejs异步流程控制

在 ExpressJS 响应中返回异步等待 try/catch 抛出错误 [重复]

Nodejs爬虫进阶=>异步并发控制