如何使用异步等待 [重复]
Posted
技术标签:
【中文标题】如何使用异步等待 [重复]【英文标题】:How to use async-await [duplicate] 【发布时间】:2020-05-12 02:23:52 【问题描述】:我需要在函数中运行各个步骤,但步骤必须按特定顺序运行。我尝试实现一个Async
函数如下:
async function test()
await setTimeout(function() console.log('1'); , 5000);
await setTimeout(function() console.log('2'); , 2000);
console.log('3');
test();
控制台中的预期结果应该是 1、2、3,但我得到的是 3、2、1。
好像await
参数被忽略了。
编辑
setTimeout
函数在上面的示例中仅用于模拟繁重的任务。在我的项目中,我不会使用它。实际上,我需要连接到数据库,然后重新格式化结果,然后再进行下一步。即使包含async-await
,2 也会在 1 之前登录。换句话说,空列表被传递到我的图形,因为async-await
没有被考虑在内。这是我当前的代码:
async function refreshData()
myLabel = [];
myValues = [];
myJSON = [];
const sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database(fullPath + '/annex/data.db');
await new Promise(resolve =>
db.each('SELECT firstName, age FROM Info;', function(err, row)
console.log('1');
myLabel.push(row.firstName);
myValues.push(row.age);
myJSON.push(JSON.stringify(row));
);
resolve(myValues);
resolve(myLabel);
resolve(myJSON);
);
console.log('2');
db.close();
popChart(myLabel, myValues);
popTable();
【问题讨论】:
问题是,setTimeout 没有返回一个承诺,所以你不能等待它。 【参考方案1】:对于在function
上使用await
并等待函数执行,它必须在promise
上运行,因此您可以创建一个新函数delay
,它在自身内部调用setTimeout
,但运行在promise
,所以一旦超时后控制台被记录,它就会返回,并且调用函数将保持执行,直到它得到承诺resolved
阅读this,通过更多示例更好地理解
function delay (val,time)
return new Promise((resolve,reject)=>
setTimeout(function() console.log(val); resolve(true) , time);
);
async function test()
await delay('1',5000);
await delay('2',2000);
console.log('3');
test();
【讨论】:
【参考方案2】:使用这个:
async function test()
await new Promise(resolve =>
setTimeout(function() console.log('1'); resolve(); , 5000)
);
await new Promise(resolve =>
setTimeout(function() console.log('2'); resolve(); , 2000)
);
console.log('3');
test();
【讨论】:
【参考方案3】:我用过以下
function wait(time)
return new Promise((resolve) => setTimeout(resolve, time));
然后你就在你的方法中等待这个函数。
【讨论】:
【参考方案4】:你可以写一个wait
函数:
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
async function test()
console.log('1');
await wait(5000);
console.log('2');
await wait(2000);
console.log('3');
test();
【讨论】:
setTimeout
仅用于模拟繁重的任务。我的目标是连接到数据库、收集信息、重新格式化结果并最终更新图形。但所有步骤都必须按特定顺序完成。我已经相应地编辑了我的问题。
您已将问题改写为完全不同的问题以上是关于如何使用异步等待 [重复]的主要内容,如果未能解决你的问题,请参考以下文章