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

飞镖等待内心的未来

马华茂
2023-03-14

我正在尝试执行一些相互引用作为外键的查询,因此我必须等到外部未来完成。此算法放置在返回未来的函数中。

Future<List<int>> newEntry(Session session) {
    bool success = true;
    List<int> error = Helpers.formatJsonAndEncodeUtf8(
    "ERROR 3623231 (Experiencebox could not be saved )", session: session);
    Future coucheFutureQuerySave = new Future(() {
      new Couchbase().couchConnExperiencebox.set(uniqueId, UTF8.encode(
          documentOriented.toString())).catchError((error) {
        print("COUCHEBASE ERROR 338420: " + error.toString());
        success = false;
      });
    }).catchError((error) {
      print("COUCHEBASE ERROR 338121: " + error.toString());
      success = false;
    });
    // Save data to MySql Database
    //create archiv entry
    Future <Results> mysql = mysqlCon.query(
        getQuery()).catchError((error) {
      print("failed archive");
      success = false;
    }).whenComplete((){
      print("completed archive");
      //querystring for insert word
      String wordQuery = new Tag().getInsertWordIfNotExists(tags);
      mysqlCon.query( wordQuery ).catchError((error) {
        print("failed word");
        success = false;
      }).whenComplete((){
        print("completed word");
        //query string for insert tags in blog
        String tagQuery = new Tag().getInsertTagsInBlogIfNotExists(tags, uniqueId);
        mysqlCon.query( tagQuery ).catchError((error) {
          print("failed tag in blog");
          success = false;
        });
      });
    });
    return Future.wait([mysql, coucheFutureQuerySave]).then((e) {
      // Save data to CoucheBase
      if (success) {
        print("completed all");
        return Helpers.formatJsonAndEncodeUtf8('OK', session: session, data:
            [new JsonObject.fromJsonString('{"id":"' + uniqueId + '"}')]);
      } else {
        print("failed");
        success = false;
      }
    });
}

运行它时,我得到了这个:

=== TO CLIENT ===
已完成存档
已完成全部
=== TO CLIENT ===
失败的
单词已完成 的单词
已完成 标记在博客中
完成投票

所以我的问题是,我怎么能等到未来的< code>mysql完成它的“childs”(在< code>whenCompleted()函数中)。我还尝试使用< code>then()而不是< code>whenCompleted(),但这并没有任何区别。

共有1个答案

时向文
2023-03-14

确保在异步函数中调用异步函数时总是返回未来值,以保持它们之间的连接。当您调用异步函数时,如

.then((x) => someAsync())

从< code>someAsync()返回的future是自动返回的,但是当您的代码具有类似

.then((x) {
  return someAsync()
 })

你需要显式返回。

有两行以

mysqlCon.query(

实际上应该是

return mysqlCon.query(

这条线

new Couchbase()

应该是可能是

return new Couchbase()

使用新的async/wait功能可以显着简化您的代码。

 类似资料:
  • 我知道会获取一个期货列表,并在列表中的所有期货都完成后返回已完成的期货列表。 在Dart中,有没有一种方法可以阻止并等待列表中的任何未来完成,而不是等待它们全部完成?

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

  • [![Plugins installed][1][1]我已经在android studio中安装了这些插件,并将C:\flatter\bin添加到系统环境变量中,但当我在PowerShell中运行flatter doctor时,它显示这些插件没有安装。我用的是Windows操作系统。

  • 我有一个方法,可以返回期货的 现在我想等待,直到所有的future都成功完成处理,或者future返回其输出的任何任务抛出异常。即使一项任务引发异常,等待另一项任务也没有意义。 简单的方法是 但这里的问题是,例如,如果第四个期货抛出异常,那么我将不必要地等待前三个期货可用。 如何解决这个问题?会以任何方式倒数闩锁帮助吗?我无法使用Future,因为java文档说

  • 我已经在Android studio上安装了颤振,每当我在Android studio上导入新项目时,它会显示“Dart未配置下载Dart SDK或打开Dart设置” 到目前为止,代码还不错。 当我打开省道设置时 Idk在每个项目中尝试了什么,只有在新的颤振项目运行良好时才尝试。颤振版本是2.8.1 Dart版本是2.15.1 Android Studio Arctic Fox | 2020.3.

  • 显然这是某种例外,但是(1)为什么我们不需要指定它的类型,(2)我可以添加什么来指定它的具体类型?例如,如何以类似于的方式处理多种类型的可能异常?