serveless踩坑-同步机制

发表于:2021-07-04 02:59技术,nodejs,serveless热度:80喜欢:0

没有真正的异步

router.get('/track', async (req, res) => {
  track( ...req.query );
  res.type('image/png').send('1');
});

function track(){
  setTimeOut(()=>{
    // do something
  },2000)
}

由于nodejs的异步机制,setTimeOut挂载到任务队列里面,track算执行完成了,直接走到res.send这一步了
执行完成,这玩意直接算是释放掉了,导致track的setTimeOut里面的实际上未执行
正确的做法应该是

router.get('/track', async (req, res) => {
  await track( ...req.query );
  res.type('image/png').send('1');
});

function track(){
  return new Promise((resolve)=>{
    setTimeOut(()=>{
      // do something
      resolve()
    },2000)
  })
}