了解web前端的人应该都知道,Promise
在前端异步编程中重要地位。在Dart的学习中,我们也接触到了一些异步编程的方式,如使用Future
, Stream
, Completer
, Timer
等等。
对于web开发者来说,dart的整个异步架构和js非常相似,都有相应的Event Loop
的概念,所以我们也可以用一些js的经验来理解和学习dart, 比如js中的Promise
和dart中的Future
就是一个很好的例子。
Dart中的异步Future
和js中的Promise
很像。
如在js中, 我们实现一个delay函数
function delay(ms) {
return new Promise(resolve => {
setTimeout(() => resolve('done'), ms)
)
}
delay(3000).then(val => {
console.log(val);
})
在dart中也可以实现这样的功能, 需要借助Completer
Future delay(int ms) {
final com = Completer();
final future = com.future;
Timer(Duration(milliseconds: ms), () {
com.complete('done');
});
return future;
}
// 调用
delay(3000).then((val){
print(val);
});
而且Promise.race
, Promise.all
, then
, catch
, finally
, Promise.resolve
, Promise.reject
等在dart Future
中都有相应的实现
// any 对应js中的Promise.race
Future.any([delay(3000), delay(1500)]).then((_){
print('1.5s后被调用');
});
// wait 对应js中的Promise.all
Future.wait([delay(3000), delay(1500)]).then((_){
print('3s后被调用');
});
// error和catchError对应js中的Promise.reject 和catch
Future.error('error').catchError(print);
// value 和 then 对应js中的Promise.resolve和then
Future.value('value').then(print);
// whenComplete 对应js中的finally
Future.error('error').whenComplete((){
print('finally');
});
另外, js中的Promise
可以给async/await
调用, 同样在dart中Future
也可以给async/await
调用
void test() async {
await delay(1000);
print('1s后被调用');
}
当然, Future还有其他高级功能, 如Future.microtask
, Future.sync
, Future.delayed
等等。
甚至, 如果我们知道js中Promise
的实现原理, 我们也可以在Dart中造一个Promise
出来,
分享一个dart-promise
的简单实现。https://github.com/w-rudolph/dart-promise