我需要在使用 async/await 方法完成 API 调用 3 秒后调用 await 函数,但不知道如何操作。
我尝试将 await 函数包装在 setTimeout(( 函数中,但最终收到错误:语法错误: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' } }
太棒了! 感谢@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)
不确定这是否是最佳实践,但它对我有用。
非常感谢大家!
虽然这可以通过使用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 中的函数名称在调试期间为您提供帮助(但它们是可选的(。
你必须在异步中使用await函数。
我们的 Promise 代码中没有 async 和 await 关键字。我们使用它们来配置异步函数来调用我们的 promise 并等待它完成,如下所示:
var callMyPromise = async () => {
var result = await (myPromise());
return result;
};