我正在尝试执行一些相互引用作为外键的查询,因此我必须等到外部未来完成。 该算法放在一个返回未来的函数中。
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()
,但这没有任何区别。
答案 0 :(得分:2)
确保在异步函数中调用异步函数时始终返回将来以保持连接。 当你调用像
这样的异步函数时.then((x) => someAsync())
将自动返回从someAsync()
返回的未来,但是当您的代码具有类似
.then((x) {
return someAsync()
})
你需要明确返回。
有两行以
开头mysqlCon.query(
实际应该是
return mysqlCon.query(
这一行
new Couchbase()
应该是
return new Couchbase()
使用新的async / await功能可以显着简化您的代码。