我有一个返回 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();
。如果您删除或修复它,则应该可以看到将来的完成。