3秒后如何运行等待功能

时间:2019-04-22 14:16:51

标签: javascript node.js async-await settimeout

使用async / await方法完成API调用后,我需要在3秒后调用await函数,但是不知道如何执行。

我尝试将 await 函数包装在setTimeout()函数中,但最终收到错误: SyntaxError:await仅在异步函数中有效

async function tasks(
  task_id, tokenTenant
) {
  return axios({
    method: "get",
    url: `https://omitted_url/api/v1/ftth/task/${task_id}`,
    headers: {"X-Auth-Token": tokenTenant}
  }).then(res => res)
}
setTimeout(function () {
   taskResponse = await tasks(resStatus.data.task.id, tokenTenant)
   console.log(taskResponse.data)
   }, 3000)

控制台中的预期结果:

$个数据:

   { id: '123abc456def',
     status: 'Received',
     result: null,
     tenant_id: 'john_doe_tenant_id1234',
     creation_time: '2019-04-22T13:49:01+0000' } }

3 个答案:

答案 0 :(得分:0)

虽然可以通过使用async函数很容易地将其修复,就像错误所提示的那样:

 setTimeout(async function () {

setTimeout声明为:

 const delay = ms => new Promise(res => setTimeout(res, ms));

因为它可以这样写:

 (async function /*³*/ delayTask() {
    await delay(3000);
    /*¹*/const taskResponse = await tasks(resStatus.data.task.id, tokenTenant); /*²*/
    console.log(taskResponse.data);
})();

注意:

¹:始终声明变量!

²:永远不要信任ASI来救助您,请使用分号!

³:IIFE中的函数名称在调试期间会为您提供帮助(但它们是可选的)。

答案 1 :(得分:0)

太棒了!感谢@JonasWilms和@SelmiKarim为我指出正确的方向。

通过更改以下代码的原始代码,我设法使setTimeout()起作用:

setTimeout(function () {
   taskResponse = await tasks(resStatus.data.task.id, tokenTenant)
   console.log(taskResponse.data)
   }, 3000)

const promise1 = new Promise(function (resolve, reject) {
  setTimeout(function () {
    resolve(tasks(resStatus.data.task.id, tokenTenant))
  }, 3000);
})

respo = await promise1.then(resp => resp)

不确定这是否是最佳做法,但对我有用。

非常感谢大家!

答案 2 :(得分:0)

必须在异步内部使用await函数。

我们的Promise代码中缺少async和await关键字。我们使用它们来配置异步函数,这些函数调用我们的promise并等待其完成,如下所示:

var callMyPromise = async () => {
    var result = await (myPromise());
    return result;
};