dart - 如何在没有“异步”的情况下等待 Future 的完成
问题描述
如何在没有“异步”和“期货”的情况下等待 Future 的完成?
在我使用的库中,所有函数都是异步的。
// must return <bool>
bool my_func(int x){
//returns Future<int>
var tmp = somelib.somefunc( ... );
//wait y
return x == y;
}
我试图写我的'await',但是等待一个while循环的结果会冻结一切。
dynamic my_await(Future f) {
dynamic x;
bool completed = false;
f.then((v){
x = v;
completed = true;
});
do {} while (!completed);
return x;
}
Dart VM version: 1.24.3 (Mon Dec 18 16:57:48 2017) on "linux_x64"
解决方案
同步函数,或者实际上是任何 Dart 函数,在你调用它们时会立即返回一个值。如果您想立即返回一个布尔值,并且该布尔值的值取决于某个未来完成的结果,那么就无法及时计算该布尔值。
如果您需要等待未来,那么您的函数是异步的。您需要立即返回某些内容,即使您还不知道结果。那就是a Future
。它在任何方面都不是神奇的,它只是一个对象,你可以设置一个回调,当一些结果准备好时调用它。
因此,您需要返回 aFuture<bool>
才能使其正常工作。
Dart 是单线程的。不使用隔离,就没有并发。相反,异步函数轮流工作,给其他代码运行时间,例如,当它们等待未来时。如果您只执行 ado {} while (!completed);
然后没有其他代码可以运行,这意味着没有任何东西可以设置completed
为 true。
推荐阅读
- python - 像在 Keras 中一样在 pytorch 中获取交叉熵损失
- swift - userId 来 appdelegate 还是不去 Mainviewcontroller 为什么?迅速
- c# - C#/WPF 程序突然变成垃圾收集器绑定 - 如何检测?
- javascript - Safari 上的 D3.js 幽灵/神器
- c# - 如何将 List 值分配给 List ValueTuples?
- mysql - 向数据库中的只读用户授予对存储过程和 udfs 的访问权限,不包括可以插入的 udfs/procedures
- flutter - 如何像facebook一样显示flutter的时差
- python - 安装 jupyterlab/latex 扩展时重建失败
- php - 在PHP(Laravel)中将字符串(数组格式)转换为数组
- javascript - 将 MergeMap 与从另一个 observable 接收的数据数组一起使用 - RxJs Angular