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

异步/等待/然后飞镖/颤振

汲丰茂
2023-03-14

我有一个flutter应用程序,我在其中使用SQFLITE插件从SQLite DB中获取数据。这里我面临一个奇怪的问题。根据我的理解,我们使用async/wait或then()函数进行异步编程。这里我有一个db.query()方法,它执行一些SQL查询以从DB中获取数据。在这个函数获取数据后,我们在. then()函数中做一些进一步的处理。然而,在这种方法中,我遇到了一些问题。从我调用getExensesByFundId(int fundId)函数的地方来看,它似乎没有正确获取数据。它应该返回Future

然而,我只是做了一些实验,并在数据库前面添加了“wait”关键字。query()函数,但不知怎么的,它刚刚开始正常工作。你能解释一下为什么添加wait关键字可以解决这个问题吗?我在使用时想。然后()函数,我们不需要使用wait关键字。

这是我的代码:

Future<List<Expense>> getExpensesByFundId(int fundId) async {
    Database db = await database;

    List<Expense> expenseList = List();

   // The await in the below line is what I'm talking about

    await db.query(expTable,where: '$expTable.$expFundId = $fundId')
        .then((List<Map<String,dynamic>> expList){
      expList.forEach((Map<String, dynamic> expMap){
        expenseList.add(Expense.fromMap(expMap));
      });
    });
    return expenseList;
  }

共有3个答案

公良育
2023-03-14

当让类使用async来使用await时,它的简单逻辑是在函数中创建等待状态,直到数据被检索出来显示。

示例:1)单击按钮时类似于2)数据首先存储在数据库中,而不是未来函数用于检索数据3)将该数据移动到变量中,然后在屏幕中显示4)变量在以下/配置文件中显示类似增量。

然后是一步一步地使用代码,将数据存储在变量中,然后移动到下一步。

示例:如果我点击follow按钮,直到data store in variable,它会连续检索一些要存储的数据,并且不允许下一个函数运行,如果一个任务完成,则移动到另一个任务。

和你的问题一样,我也在做社交媒体flutter应用程序的实验,这是我的理解。我希望这会有所帮助。

方谦
2023-03-14

补充以上答案。

颤振应用程序据说是一步一步地执行代码,但事实并非如此。在应用程序的生命周期中会触发很多事件,比如点击事件、计时器等等。一定有一些代码应该在后台线程中运行。

后台工作如何执行:

因此有两个队列

  1. 微任务队列

微任务队列运行不应该由任何事件(单击、计时器等)运行的代码。它可以包含同步和异步工作。

事件队列在应用程序中发生任何外部单击事件(如单击事件)时运行,然后阻止在事件循环内执行。

下图将详细解释执行将如何进行。

注意:在任何给定的作用点,微任务队列将运行,然后只有事件队列将能够运行。

史高阳
2023-03-14

用简单的话来说:

await用于中断流程,直到async方法完成<但是,code>then不会中断流程(意味着将执行下一条指令),而是允许您在async方法完成时运行代码。

在您的示例中,当您使用then时,您无法实现您想要的,因为代码没有“等待”,并且return语句被处理,因此返回一个空列表。

当您添加wait时,您明确地说:'在我的Future方法完成之前不要进一步(即然后部分)。

您可以编写如下代码以仅使用wait实现相同的结果:

Future<List<Expense>> getExpensesByFundId(int fundId) async {
    Database db = await database;

    List<Expense> expenseList = List();

    List<Map<String,dynamic>> expList = await db.query(expTable,where: '$expTable.$expFundId = $fundId');
    expList.forEach((Map<String, dynamic> expMap) {
        expenseList.add(Expense.fromMap(expMap));
    });

    return expenseList;
}

您也可以选择只使用然后部分,但需要确保之后正确调用getExpensesByFundId

Future<List<Expense>> getExpensesByFundId(int fundId) async {
    Database db = await database;

    List<Expense> expenseList = List();
    
    return db.query(expTable,where: '$expTable.$expFundId = $fundId')
        .then((List<Map<String,dynamic>> expList){
      expList.forEach((Map<String, dynamic> expMap){
        expenseList.add(Expense.fromMap(expMap));
      });
    });
}

// call either with an await
List<Expense> list = await getExpensesByFundId(1);
// or with a then (knowing that this will not interrupt the process flow and process the next instruction
getExpensesByFundId(1).then((List<Expense> l) { /*...*/ });
 类似资料:
  • 我正在尝试执行一些相互引用作为外键的查询,因此我必须等到外部未来完成。此算法放置在返回未来的函数中。 运行它时,我得到了这个: === TO CLIENT === 已完成存档 已完成全部 === TO CLIENT === 失败的 单词已完成 的单词 已完成 标记在博客中 完成投票 所以我的问题是,我怎么能等到未来的< code>mysql完成它的“childs”(在< code>whenComp

  • 在flutter示例页面中,有一个名为“将数据发送到新屏幕”的项目。我对第65行的构造函数有一个重新保护的问题。

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

  • 自从我开始使用Flatter以来,我面临着一个与Flatter async await相关的问题。大多数时候,我试图用未来和等待的结果,它跳过等待,并得到最短的方式返回 请帮助我更好地理解flatter async wait,或者告诉我哪里做错了,这样我就可以改进我的代码

  • 我试图改变从API返回的日期字符串的格式。下面的日期格式输入字符串在java中工作正常,但在Dart中则不行。

  • 我一直在使用VSCode进行颤振开发,但没有问题。今天,飞镖分析器突然抱怨说,大多数类都是未定义的,或者目标不存在。 有人见过这个吗? 我已经重新启动了VSCode,重新启动了计算机,卸载了flutter/dart插件,运行flutter dr没有任何问题……我没有想法了。 VSCode问题