未来在函数调用完成之前完成

时间:2014-11-27 16:01:05

标签: dart dart-async

我正在使用两个函数,它们都应该返回未来。当它们都完成时,第三个函数被调用。现在,未来太早返回,所以我的第三个函数在第二个函数完成之前被调用。

功能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;完成了。

1 个答案:

答案 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