使用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' } }
答案 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;
};