flutter - Dart Completer.complete() 结果永远不会解决
问题描述
我有一个返回未来的函数,该函数取决于要解决的回调结果:
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();
. 如果您删除或修复它,您应该会看到您的未来已完成。
推荐阅读
- python - 其他文件中的 Python 字典不更新
- linkedin - 带有图片和号召性用语的 LinkedIn 创意广告
- .net - 包装器和混淆器使用哪些已知技术来防止反编译?
- ubuntu-18.04 - libvert-guests.sh 27209:在默认 URI 中运行来宾:没有正在运行的来宾
- scala - spark-shell - 如何避免抑制省略的堆栈跟踪(异常)
- reactjs - 图标未在语义 UI React 输入字段中呈现
- amazon-web-services - 不可破解的 AWS S3 公共存储桶
- javascript - 为什么这是有效的语法?
- c# - VS2019-Debugger 产生高 CPU(取决于 CancellationTokens?)
- c - 如何让 fgets 接收用户输入?