文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
A.4 Promise 与回调
我认为 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论