Dart和js中的异步 - Future vs Promise

了解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

你可能感兴趣的:(Dart和js中的异步 - Future vs Promise)