当前位置: 首页 > 知识库问答 >
问题:

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

南门正祥
2023-03-14

我需要在函数中运行各种步骤,但步骤必须按特定顺序运行。我尝试实现一个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。似乎忽略了wait参数。

编辑setTimeout功能在上面的示例中仅用于模拟繁重的任务。在我的项目中,我不会使用它。事实上,我需要连接到一个数据库,然后在进入下一步之前重新格式化结果。即使包括异步等待,2也会在1之前登录。换句话说,空列表被传递到我的图形,因为没有考虑async wait。以下是我当前的代码:

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(); 
}

共有3个答案

盖和洽
2023-03-14

使用此:

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();
丌官晨
2023-03-14

我使用了以下方法

function wait(time) {
    return new Promise((resolve) => setTimeout(resolve, time));
}

然后在方法中等待这个函数。

凌经赋
2023-03-14

您可以编写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();
 类似资料:
  • 问题内容: 我一直在浏览/ 在浏览了几篇文章之后,我决定自己测试一下。但是,我似乎无法绕开为什么这行不通的想法: 控制台输出以下内容(节点v8.6.0): 外部:[对象承诺] 内部:嘿 为什么函数内部的日志消息随后执行?我认为创建/ 的原因是为了使用异步任务执行同步执行。 有没有办法可以使用函数内部返回的值而不使用after ? 问题答案: 我似乎无法绕开为什么这行不通的想法。 因为回报承诺;所有

  • 我有一个windows服务,我从另一个开发人员继承,它运行非常慢,并有许多对eBay API的缓慢调用。我希望在没有太多重构的情况下加快它。 我刚刚开始研究使用C#Async/Await来尝试让这些缓慢的调用运行异步。以下是我试图实现的目标: 如何获取返回的类型以便使用它们?我尝试使用,但它只有属性可用。

  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 问题内容: 示例了如何使用内置的加密库和流来计算文件的md5。 但是是否可以将其转换为使用ES8异步/等待而不是使用上述回调,但仍保持使用流的效率? 问题答案: / 仅适用于promise,不适用于流。有一些想法可以制作一种类似流的额外数据类型,该数据类型将具有自己的语法,但是如果有的话,这些想法是高度实验性的,我将不赘述。 无论如何,您的回调仅等待流结束,这非常适合兑现承诺。您只需要包装流: 现

  • 问题内容: 给出以下代码: 产生以下错误: TS2322:类型’Promise []’无法分配给类型’number []’。类型’Promise 不可分配给类型’number’。 我该如何解决?怎样才能让和一起工作? 问题答案: 这里的问题是,您正在尝试兑现承诺而不是承诺。这没有达到您的期望。 当传递给的对象不是Promise时,只需立即按原样返回值,而不是尝试解析它。因此,由于您在此处传递了(P

  • 我想进行一个基于当前状态的API调用,但不能使setState函数作为异步函数工作。 给我错误: 类型为“”的参数(状态:只读)= 如果我在setState方法之外获取数据,它会起作用,但我害怕对过时的页码进行API调用: