飞镖等待内心的未来
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 功能可以显着简化您的代码。
我正在尝试执行一些查询,这些查询相互之间有外键引用,所以我必须等到外部未来完成。 该算法被放置在一个 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 功能可以显着简化您的代码。