如何使用异步等待

时间:2020-01-26 13:28:45

标签: javascript async-await

我需要在一个函数中运行各种步骤,但是必须以特定的顺序运行。我试图实现一个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(); 
}

5 个答案:

答案 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,并在到达回调时进行解析。

另一件事,您只能解析一次,因此请尝试将所有值包装在一个对象中并解决该问题,而不是进行三次操作