我正在使用两个函数,它们都应该返回未来。当它们都完成时,第三个函数被调用。现在,未来太早返回,所以我的第三个函数在第二个函数完成之前被调用。
功能1:
static var getObjectDataCompleter = new Completer();
static var fillObjectCompleter = new Completer();
static Future getObjectData(List jsonMap) {
for (int i = 0; i < jsonMap.length; i++) {
fillObjectCompleter = new Completer();
var request = buildRequest("GET", resourceUrl);
request.send();
request.onLoadEnd.listen((event) => fillObject(request));
}
if(fillObjectCompleter.isCompleted) {
getObjectDataCompleter.complete(null);
}
return getObjectDataCompleter.future;
}
功能2:
static Future fillObject(HttpRequest request) {
String responseText = request.response;
List stringJson = JSON.decode(responseText);
fillObjectCompleter.complete(null);
return fillObjectCompleter.future;
}
Function1在调用之前返回未来&#34; fillObject()&#34;完成。
我做错了什么?
当&#34; for-loop&#34;时,应该返回function1-future。完成了所有&#34; fillObject-calls&#34;完成了。
答案 0 :(得分:2)
异步代码只是安排在以后执行,同步代码继续执行而不等待异步代码。当调度的异步代码完成时,将执行传递Future.then(...)
的方法Completer
。你发现很多这样的问题和例子在StackOverflow上标记为[:dart-async:]。
我很难搞清楚你真正想要完成的事情。你能否在prosa中解释你实际上想要实现的目标,然后我可以尝试修复你的代码示例来做你想做的事。
通常不需要在自定义异步函数中使用return
。您只需通过始终返回呼叫的未来来确保嵌套的异步调用被正确链接
请参阅以下代码的这两行作为示例。 return async.Future.forEach(jsonMap, (item) {
return request.onLoadEnd.first.then((event) => fillObject(event.target));
对于该示例的工作非常重要。
getObjectData
在处理完所有请求的响应后,import 'dart:html' as dom;
import 'dart:async' as async;
import 'dart:convert' show JSON;
class Xxx {
static async.Future getObjectData(List jsonMap) {
return async.Future.forEach(jsonMap, (item) {
//var request = new dom.HttpRequest();
//request.open("GET", "https://www.googleapis.com/discovery/v1/apis?fields=");
var request = buildRequest("GET", resourceUrl);
request.send();
return request.onLoadEnd.first.then((event) => fillObject(event.target));
});
}
static fillObject(dom.HttpRequest request) {
print('fillObject');
String responseText = request.response;
List stringJson = JSON.decode(responseText);
}
}
void main() {
var json = ['a', 'b', 'c'];
Xxx.getObjectData(json).then((_) => print('done'));
}
返回的Future完成。
{{1}}
有关异步执行的详细信息,请参阅https://www.dartlang.org/articles/event-loop。