飞镖等待内心的未来

时间:2015-04-24 08:58:55

标签: mysql dart

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

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

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

  

===致客户===
  完成档案   完成所有
  ===致客户===
  失败的词
  完成的单词
  在博客中完成标记
  完成投票

所以我的问题是,在完成其“孩子”(在mysql函数中)之前,我怎么能等待Future whenCompleted()。我也尝试使用then()代替whenCompleted(),但这没有任何区别。

1 个答案:

答案 0 :(得分:2)

确保在异步函数中调用异步函数时始终返回将来以保持连接。 当你调用像

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

将自动返回从someAsync()返回的未来,但是当您的代码具有类似

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

你需要明确返回。

有两行以

开头
mysqlCon.query(

实际应该是

return mysqlCon.query(

这一行

new Couchbase()

应该是

return new Couchbase()

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