Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

ES6 的 Jobs

  现在好像大家都喜欢扯 ES6,但大部分时候扯的都是那些看得见写得出的东西。实际上 ES6 中还有很多看不见的重要概念,比如 Jobs 就是一个 ES6 的颠覆性改动。说白了 ES5 及之前的版本根本就不支持异步,我们一直以来使用的所谓「异步」都是执行环境提供的。
  甚至以前版本的 ES 根本就没有完善的「消息机制」的概念。只是各个执行环境「碰巧」将它们的行为一致地实现为了「消息队列」而已。其实作为一种编程语言,能线性执行就已经很图灵了,异步根本就是不图灵的东西。然而 ES6 中的一些概念却是基于 Jobs 的,比如 Promise 的 then 回调,其标准定义都是「在下一个脚本帧中执行」。所以既然吸收了 Promise 到规范中就不得不把 Jobs 也一并规范了,否则就会出现很奇怪的结果(见「Promise 与 setTimeout 的异步速度比较」)。
  上面我一直在扯「异步」,这个说法可能会被喷。因为其实 Jobs 也不是真正的异步,只是引入了一个执行队列的概念。每次把任务添加到队列尾部,当执行堆栈空时就取出这个任务队列首部的任务来执行。虽然本质并不是「异步」,不过把这种东西称为「异步」也没什么,反正我们一直都这么叫。因为这个概念已经和 setTimeout 以及 setImmediate 类似了。
  另外,ES6 中定义的任务队列实际上不止一条。Promise 相关的使用了一条,其它如 Module 相关的操作也占了一条。这两条队列的执行顺序并不限制,可能产生两条队列间的任务交错执行的情况。虽然规范这么说吧,当具体实现并不固定。而且限制谈这些还有点早,反正各家的实现依然是各种 Bug。
  总之,ES6 把 Jobs 这东西给标准化这是我一直以来很期待的事情。但我很好奇为什么它只定义了 Jobs,而不是把整个 setTimeout 都搬进来。
网名:
34.203.245.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^