如何使用异步等待 [重复]

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-await2 也会在 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 仅用于模拟繁重的任务。我的目标是连接到数据库、收集信息、重新格式化结果并最终更新图形。但所有步骤都必须按特定顺序完成。我已经相应地编辑了我的问题。 您已将问题改写为完全不同的问题

以上是关于如何使用异步等待 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何快速使用异步函数?完成处理程序[重复]

如何在.NET中调用异步函数而不等待它[重复]

如何在 fetch 中执行跨域请求以及异步等待? (CORS 错误)[重复]

使用流异步读取文件时如何同步处理每一行/缓冲区[重复]

无法理解异步和等待的需求[重复]

Angular 8 - 如何使用 Promises 和 Async/Await [重复]