我有一个返回 future 的函数,该函数取决于要解决的回调结果:

   Future connectSocket(String email, String password, {Function onConnectCallback}) async {
    var completer = new Completer();
    print("Connecting...");
    var query = getQueryString(email, password);
    socketIO = await SocketIOManager().createInstance(SocketOptions(localDomainWindows, query: query));

    socketIO.on("loginError", (data) {
      print("Login err");
      _connected = false;
      connectedCallback();
      completer.complete(false);
    });

    socketIO.onConnect((data) {
      print("***CONNECTED***");
      _connected = true;
      completer.complete(true);
      connectedCallback();
    });
    socketIO.connect();
    return completer.future;
  }

我可以看到***CONNECTED***打印到控制台,并且我的套接字服务器确认了该连接,但是await函数-解析度永远不会恢复,它只是挂起。
    socketConnection.connectSocket(_email, _password)
    .then((success) {
     print("SUCCESS") // never gets printed
}

最佳答案

对此的唯一可能解释是,回调中的某些代码阻止您的程序继续运行,因为Completer.complete否则应始终使future完整。
但是,如果被阻止,则事件循环将永远无法调用您的代码。

因为bool分配永远都不会阻塞(_connected = true;),所以函数中可能会暂停程序的唯一部分是connectedCallack();。如果您删除或修复它,则应该可以看到将来的完成。

09-03 20:47