Asynchronous 对请求进行回调的Dart未来函数
我在理解dart和异步编程中的未来函数时遇到了一个问题。我在网上找到的例子并不能回答我的问题,所以我非常感谢社区的帮助 我有一个函数,用于请求玩家消息列表:Asynchronous 对请求进行回调的Dart未来函数,asynchronous,dart,future,Asynchronous,Dart,Future,我在理解dart和异步编程中的未来函数时遇到了一个问题。我在网上找到的例子并不能回答我的问题,所以我非常感谢社区的帮助 我有一个函数,用于请求玩家消息列表: Future getMessagesInfo(response) async{ dialogs = []; // I need this list to be filled to proceed messagesList = response["data"]; await getDialogs
Future getMessagesInfo(response) async{
dialogs = []; // I need this list to be filled to proceed
messagesList = response["data"];
await getDialogsFunc(messagesList);
renderMessages();
}
这是对前一个请求的回调,这在这里并不重要。
下面是getDialogsFunc,其目的是遍历列表并向playerInfo请求响应中的每个ID:
Future getDialogsFunc(messagesList) async{
for(var i=0;i<messagesList.length;i++){
if(messagesList[i]["player2"] != player.ID) await rm.getDialogInfo(messagesList[i]["player2"]);
if(messagesList[i]["player1"] != player.ID) await rm.getDialogInfo(messagesList[i]["player1"]);
}
}
请求是一个简单的类,用于处理请求:
class Request{
Future sendRequest(Object data, bool action,Function callback) async{
HttpRequest request = new HttpRequest();
String url = "http://example.com";
await request
..open('POST', url)
..onLoadEnd.listen((e)=> callback(JSON.decode(request.responseText)))
..send(JSON.encode(data));
}
}
最后,这里是请求的回调:
Future onGotDialogInfo(response) async{
List dialog = new List();
dialog.add(response["data"]["id"]);
dialog.add(response["data"]["login"]);
dialogs.add(dialog);
}
在第一个函数中,我希望在收到有关所有消息的信息后运行renderMessages()
,以便对话框
列表应包含相关信息。在我用断点测试的实现中,renderMessages()
函数在onGotDialogInfo
回调之前运行
我应该怎么做才能等待整个循环
getDialogsFunc
函数,然后转到renderMessages()
?当complete
类似于finally
时,无论请求是正常返回还是有错误返回,都会调用它。通常使用,然后使用
getDialogsFunc
使用async
,但不使用wait
,这有点不常见。这可能是你的意图,但我不确定
Future getDialogsFunc(messagesList) async {
for(var i=0;i<messagesList.length;i++){
if(messagesList[i]["player2"] != player.ID)
await rm.getDialogInfo(messagesList[i]["player2"]);
if(messagesList[i]["player1"] != player.ID)
await rm.getDialogInfo(messagesList[i]["player1"]);
}
}
我不知道请求来自哪里,因此很难说代码应该是什么样子。它应至少使用await
使其他await
s按预期工作
Future getDialogInfo(int id) async {
messages = querySelector("account-messages-tab");
var request = new Request();
Object data = {"id": ServerAPI.PLAYER_INFO, "data":{"id": id}};
final response = await request.sendRequest(data,false);
messages.onGotDialogInfo(response)
}
更新
class Request{
Future sendRequest(Object data, bool action) async{
Completer completer = new Completer();
HttpRequest request = new HttpRequest();
String url = "http://example.com";
await request
..open('POST', url)
..onLoadEnd.listen((_) {
if (request.readyState == HttpRequest.DONE) {
if (request.status == 200) {
// data saved OK.
completer.complete(JSON.decode(request.responseText)); // output the response from the server
} else {
completer.completeError(request.status);
}
}
})
..send(JSON.encode(data));
return completer.future;
}
}
你好非常感谢你的回复。我已经根据您的评论编辑了代码,但仍然没有按预期工作。请求类很简单:class request{Future sendRequest(对象数据、bool操作、函数回调)async{HttpRequest request=new HttpRequest();字符串url=”http://example.com“等待请求..打开('POST',url)…onLoadEnd.listen((e)=>回调(JSON.decode(request.responseText))…发送(JSON.encode(data));}”
很难说。“它不起作用”没有太大帮助。请编辑您的问题并将请求的代码张贴在那里。注释中的代码不可读。我已编辑了包含所有更正的代码,并添加了请求类代码。我更新了答案。我还更改了getDialogInfo()
中的最后两行,当时我面临的问题是response
是“未来的实例”
,无法获得实际值。
Future getDialogInfo(int id) async {
messages = querySelector("account-messages-tab");
var request = new Request();
Object data = {"id": ServerAPI.PLAYER_INFO, "data":{"id": id}};
final response = await request.sendRequest(data,false);
messages.onGotDialogInfo(response)
}
class Request{
Future sendRequest(Object data, bool action) async{
Completer completer = new Completer();
HttpRequest request = new HttpRequest();
String url = "http://example.com";
await request
..open('POST', url)
..onLoadEnd.listen((_) {
if (request.readyState == HttpRequest.DONE) {
if (request.status == 200) {
// data saved OK.
completer.complete(JSON.decode(request.responseText)); // output the response from the server
} else {
completer.completeError(request.status);
}
}
})
..send(JSON.encode(data));
return completer.future;
}
}