作家
登录

JavaScript与异步编程

作者: 来源: 2017-07-13 15:03:48 阅读 我要评论

  •   }, 1000) 
  • }, 1000); 
  • 层层嵌套,结不雅就是如许的漏斗形代码。可能有人想到了新标准中的 Promise,可以改写如下:


    漏斗形代码是没了,但代码量本身并没削减若干。Promise 并没能干掉落回调函数。

    1. let i = 1; 
    2. function next() { 
    3.   console.log(i); 
    4.   if (++i < 10) { 
    5.     setTimeout(next, 1000); 
    6.   } 
    7. setTimeout(next, 1000); 

    因为回调函数的存在,轮回就无法应用。不克不及轮回,那么只能推敲递归了,解法如下:

    留意固然写法是递归,但因为 next 函数都是由浏览器调用的,所以实际上并没有递归函数的调用栈构造。

    Generator——JavaScript 中的半协程

    很多说话都惹人了协程来简化异步编程,JavaScript 也有类似的概念,叫做 Generator。

    MDN 上的解释:Generator 是一种可以半途退出之后重入的函数。他们的函数高低文在每次重入后会被保持。简而言之,Generator 与通俗 Function 最大年夜的差别就是:Generator 自身保存前次调用的状况。

    举个简单的例子:

    1. function *gen() { 
    2.   yield 1; 
    3.   yield 2; 
    4.   return 3; 
    5.  
    6. void function main() { 
    7.   var iter = gen(); 
    8.   console.log(iter.next().value); 
    9.   console.log(iter.next().value); 
    10.   console.log(iter.next().value); 
    11. }(); 

    你可以应用 for ... of 遍历一个 iterator,例如

    1. for (var i of gen()) { 
    2.   console.log(i); 

    输出 1 2,最后 return 3 的结不雅不算在内。想用 Generator 的各项生成一个数组也很简单,Array.from(gen()) 或直接用 [...gen()] 即可,生成 [1, 2] 同样不包含最后的 return 3。

    Generator 是异步的吗

    Generator 也叫半协程(semicoroutine),天然与异步关系匪浅。那么 Generator 是异步的吗?

    既是也不是。前面提到,异步是相对的,例如膳绫擎的例子

    1. function *gen() { 
    2.   yield 1; 
    3.   yield 2; 
    4.   return 3; 
    5.  
    6. void function main() { 
    7.   var iter = gen(); 
    8.   console.log(iter.next().value); 
    9.   console.log(iter.next().value); 
    10.   console.log(iter.next().value); 
    11. }(); 

    调用 Generator 函数只会返回一个迭代器,当用户主动调用了 iter.next() 后,这个 Generator 函数才会真正履行。

    我们可以很直不雅的看到,gen 的办法体与 main 的办法体在瓜代履行,所以可以肯定的说,gen 相对于 main 是异步履行的。然而此段过程中,全部控制流都没有交回给浏览器,所以说 gen 和 main 相对于浏览器是同步履行的。

    用 Generator 简化异步代码

    回到最初的问题:

    1. for (let i = 0; i < 10; ++i) { 

        推荐阅读

        Web开发中的响应式图片处理

      今朝手机等移动设备网站开辟已经有比较好的解决筹划,一种是响应式网站,像笔者博客一样,PC网站就是移动网站,一种是把移动网站和PC网站分开,类似淘宝那样。大年夜网站搜刮引擎优化的角>>>详细阅读


      本文标题:JavaScript与异步编程

      地址:http://www.17bianji.com/lsqh/36197.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)