返回介绍

第一部分 类型和语法

第二部分 异步和性能

A.4 Promise 与回调

发布于 2023-05-24 16:38:21 字数 1469 浏览 0 评论 0 收藏 0

我认为 asynquence 序列在原生 Promise 之上提供了很多新的价值。多数情况下,你都会发现在这一抽象层次上工作是非常令人愉快和强大的。不过,把 asynquence 与其他非 asynquence 代码集成也是可以实现的。

通过实例方法 promise(..) 很容易把一个 promise(比如一个 thenable,参见第 3 章)归入到一个序列中:

var p = Promise.resolve( 42 );

ASQ()
.promise( p )       // 也可以: function(){ return p; }
.val( function(msg){
  console.log( msg ); // 42
} );

要实现相反的操作以及从一个序列中的某个步骤分叉 / 剔出一个 promise,可以通过 contrib 插件 toPromise 实现:

var sq = ASQ.after( 100, "Hello World" );

sq.toPromise()
// 现在这是一个标准promise链
.then( function(msg){
  return msg.toUpperCase();
} )
.then( function(msg){
  console.log( msg );   // HELLO WORLD
} );

有几个辅助工具可以让 asynquence 与使用回调的系统适配。要从序列中自动生成一个 error-first 风格回调以连入到面向回调的工具,可以使用 errfcb :

var sq = ASQ( function(done){
  // 注:期望"error-first风格"回调
  someAsyncFuncWithCB( 1, 2, done.errfcb )
} )
.val( function(msg){
  // ..
} )
.or( function(err){
  // ..
} );

// 注:期望"error-first风格"回调
anotherAsyncFuncWithCB( 1, 2, sq.errfcb() );

你还可能想要为某个工具创建一个序列封装的版本,类似于第 3 章的 promisory 和第 4 章的 thunkory,asynquence 为此提供了 ASQ.wrap(..) :

var coolUtility = ASQ.wrap( someAsyncFuncWithCB );

coolUtility( 1, 2 )
.val( function(msg){
  // ..
} )
.or( function(err){
  // ..
} );

为了清晰起见(也是为了好玩!),我们再来发明一个术语,用于表达来自 ASQ.wrap(..) 的生成序列的函数,就像这里的 coolUtility 。我建议使用 sequory(sequence+factory)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文