我需要在一个函数中运行各种步骤,但是必须以特定的顺序运行。我试图实现一个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();
}
答案 0 :(得分:0)
您可以编写一个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();
答案 1 :(得分:0)
我使用了以下
function wait(time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
然后您只需在方法中等待此功能。
答案 2 :(得分:0)
使用此:
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 :(得分:0)
要在await
上使用function
并等到函数执行,该函数必须在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();
答案 4 :(得分:0)
我认为问题在于db.each回调函数。尝试在db.each周围包装一个Promise,并在到达回调时进行解析。
另一件事,您只能解析一次,因此请尝试将所有值包装在一个对象中并解决该问题,而不是进行三次操作