飞镖等待内心的未来

dart wait for inner Future

我正在尝试执行一些查询,这些查询相互之间有外键引用,所以我必须等到外部未来完成。 该算法被放置在一个 returns 未来的函数中。

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 ===
completed archive
completed all
=== TO CLIENT ===
failed word
completed word
completed tag in blog
completed voting

所以我的问题是,如何等待 Future mysql 直到它完成其 "childs"(在 whenCompleted() 函数中)。我也尝试使用 then() 而不是 whenCompleted() 但这没有任何区别。

确保在异步函数中调用异步函数时始终return未来,以保持它们的连接。 当你调用像

这样的异步函数时
.then((x) => someAsync())

来自 someAsync() 的未来 return 自动 returned 但是当你的代码有一个像

这样的块体时
.then((x) {
  return someAsync()
 })

您需要明确地return。

有两行以

开头
mysqlCon.query(

实际上应该是

return mysqlCon.query(

这一行

new Couchbase()

应该是

return new Couchbase()

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