Asynchronous 对请求进行回调的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

我在理解dart和异步编程中的未来函数时遇到了一个问题。我在网上找到的例子并不能回答我的问题,所以我非常感谢社区的帮助

我有一个函数,用于请求玩家消息列表:

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