网络科技

    今日:1218| 主题:246121
收藏本版
互联网、科技极客的综合动态。

[其他] ES 5-6-7: 从回调函数到Promises到Generators到Async/awit – 中间

[复制链接]
溢出像雨水 发表于 2016-11-27 22:21:30
72 2

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
让我们通过使用    请求库实际使用案例。  
  步骤 1: 回调地狱 - N层深

  这就是典型的NodeJS代码的样子。每一个函数会获取一个具有常用的签名的回调函数:    function(err, response){ }  
  步骤 2: Promises - 1层深

  Promise库需要典型的回调函数:    function(err, response) { }然后将这些参数分离成then/catch链式回调    .then(function(response) { }).catch(function(err) { })  
  你可以使用    Q,或者其他可以用的promise库。我已经在这里使用bluebird。你必须先“promisify“旧式回调库的方法。  
  说明你如何必须使用“request.getAsync”代替“request.get”。这就称为“promisification” (line #2) - 它将正则方法转换为promise式的方法。而且说明了简化调用foo()的过程。
  step 3: Promises+Generators - 0层

  让我们结合promises和ES6 generators的力量。
  现在“foo”几乎是连续的。我们从callback 类型减少到promises的23行,再到promises + generators的19行。它看起来完全没有嵌套函数的平坦。当然,幕后仍有回调发生,但所见即所得。
  请注意,我们称之为“foo”的地方仍然使用promises。我们可以使用generators扁平化,这样它成为一个简单的尝试/捕获。
  1. function* callerFunction() {
  2.   try {
  3.     message = yield foo();
  4.     console.log("success!", message);
  5.   } catch (err) {
  6.     console.log("error!", err);
  7.   }
  8. }
  9. callerFunction = Promise.coroutine(callerFunction);
  10. callerFunction();
复制代码
和你所在的地方叫“调用函数”也可以是扁平的,等等,等等,直到最顶层的应用程序入口点。对于Web应用程序,该入口点是Web框架。如果Web框架意识到使用generators和promises,你可以基本上使所有的函数作为generator和永远的扁平化。那么你将接近的一些内容像    koa。  
  转化测试

  在写(    Mocha等)测试时Generators非常有用。测试通常有很多回调,但是他们按顺序运行。这是浪费异步性。你可以今天使用Generators编写测试案例,不用担心变换测试框架。  
  步骤 4: ES7 async/await

  ES7 async/await 是在generators的上面运作。Babel已经运行中(尽管它仍然在测试阶段),因此你可以今天尝试。
  等等,它是如何工作的?

  这整个魔幻简单的运作是由于NodeJS回调函数有一个标准的签名    function(err, response) { }。  
  Promise 库仅仅在你的代码间,目标函数 (request.get/post/…)和延迟对象间担任粘连作用,
  1. deferred = // create a Deferred() object
  2. customCallback = function(err, response) {
  3.   if (err) deferred.reject(err);
  4.   else deferred.resolve(response);
  5. }
复制代码
  1. // call original request.get/post/... with customCallback
  2. // return you the Deferred's promise
复制代码
当ES6引入generators,Promise库象征着黑客钩连在一起:如果你“生成一个promise”,你会得到返回的解析值。
  1. **try {**`
复制代码
  1. **response          =   yield request.getAsync(...)**
  2. ^^^^^^^^^^^^^^^^^^^^^       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  3. _to get the response_            _yield a promise_
复制代码
  1. **}    catch (error) { }**
  2.   ^^^^^^^^^^^^^^^^^^^^^
  3.     _catch the error_
复制代码
Generators如何工作是一个更大的话题。我建议你阅读    davidwalsh.name/es6-generators或者网上大量的文章。
友荐云推荐




上一篇:Google's AMP is a gilded cage
下一篇:一朝变身支付鸨|支付宝社交化,对产品有什么问题和启发? ...
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

。花落红尘、 发表于 2016-11-28 00:06:35
刚起床,睁开眼就看到楼主的帖子了,顶一下!
回复 支持 反对

使用道具 举报

sgpel 发表于 2016-11-28 00:08:08
看帖容易,回帖不易,且行且珍惜
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表