gpt4 book ai didi

dart - 在完成功能调用之前,完成了Future

转载 作者:行者123 更新时间:2023-12-03 03:27:47 26 4
gpt4 key购买 nike

我正在使用两个函数,它们两个都应该返回 future 。当两个函数都完成时,将调用第三个函数。现在,返回 future 还为时过早,因此在我的第二个功能完成之前调用了我的第三个功能。

功能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;
}

在调用“fillObject()”完成之前,Function1返回将来。
我究竟做错了什么?
完成“for循环”并且完成所有“fillObject调用”后,应该返回function1-future。

最佳答案

异步代码只是安排在以后执行,同步代码将继续执行而无需等待异步代码。计划的异步代码完成后,将执行您通过Future.then(...)传递的方法。您可以在StackOverflow上找到很多标记为[:dart-async:]的此类问题和示例。

我很难弄清楚您实际上要完成什么。您能否在prosa中解释您实际要完成的工作,然后我可以尝试修复您的代码示例以完成您想要的工作。

通常,不需要在自定义异步函数中使用Completer。您只需要确保始终返回嵌套的异步调用就可以正确地链接它们。
请参阅以下代码的这两行作为示例。 return对于该示例而言很重要。

return async.Future.forEach(jsonMap, (item) {
return request.onLoadEnd.first.then((event) => fillObject(event.target));

getObjectData返回的Future将在处理完所有请求的响应后完成。

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

有关异步执行的更多详细信息,请参见 https://www.dartlang.org/articles/event-loop

关于dart - 在完成功能调用之前,完成了Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27174647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com