
【引自老帖子的博客】什么是异步(Asynchrony)
按照维诽谤科上的解释:自力于主控制流之外产生的事宜就叫做异步。比如说有一段次序履行的代码
例如 setTimeout。这个函数会起一个准时器,在跨越指准时光后履行指定的函数。比如在一秒后输出数字 1,代码如下:
- void function main() {
- fA();
- fB();
- }();
fA => fB 是次序履行的,永远都是 fA 在 fB 的前面履行,他们就是 同步 的关系。参加这时应用 setTimeout 将 fB 延后
- void function main() {
- setTimeout(fA, 1000);
- fB();
- }();
这时,fA 相对于 fB 就是异步的。main 函数只是声清楚明了要在一秒后履行一次 fA,而并没有急速履行它。这时,fA 的┞菲握流就自力于 main 之外。
JavaScript——生成异步的说话
因为 setTimeout 的存在,至少在被 ECMA 标准化的那一刻起,JavaScript 就支撑异步编程了。与其他说话的 sleep 不合,setTimeout 是异步的——它不会阻挡当前法度榜样持续往下履行。
然而异步编程真正成长强大年夜,Ajax 的风行功弗成没。Ajax 中的 A(Asynchronous)真正获得了异步的概念——这照样 IE5、IE6 的时代。
回调函数——异步编程之痛
异步义务履行完毕之后如何通知开辟者呢?回调函数是最朴实的,轻易想到的实现方法。于是大年夜异步编程出生的那一刻起,它就和回调函数绑在了一路。
代码的履行次序是如许:
- 请求 gen,获得一个迭代器 iter。留意此时并未真正履行 gen 的函数体。
- 调用 iter.next(),履行 gen 的函数体。
- 碰到 yield 1,将 1 返回,iter.next() 的返回值即为 { done: false, value: 1 },输出 1
- 调用 iter.next()。大年夜前次 yield 出去的处所持续往下履行 gen。
- 碰到 yield 2,将 2 返回,iter.next() 的返回值即为 { done: false, value: 2 },输出 2
- 调用 iter.next()。大年夜前次 yield 出去的处所持续往下履行 gen。
- 碰到 return 3,将 3 返回,return 表示全部函数已经履行完毕。iter.next() 的返回值即为 { done: true, value: 3 },输出 3
惯例用法。如不雅需求有变,须要每秒输出一个数字(当然不是用 setInterval),JavaScript 的初学者可能会写出如许的代码:
- for (let i = 1; i < 10; ++i) {
- setTimeout(() => { // 缺点!
- console.log(i);
- }, 1000);
- }
履行结不雅是等待 1 秒后,一次性输出了所有结不雅。因为这里的轮回是同时启了 10 个准时器,每个准时器都等待 1 秒,结不雅当然是所有准时器在 1 秒后同时超时,触发还调函数。
解法也简单,只须要在前一个准时器超时后再启动另一个准时器,代码如下:
- setTimeout(() => {
- console.log(1);
- setTimeout(() => {
- console.log(2);
- setTimeout(() => {
- console.log(3);
- setTimeout(() => {
- console.log(4);
- setTimeout(() => {
- console.log(5);
- setTimeout(() => {
- // ...
- }, 1000);
- }, 1000);
- }, 1000)
- }, 1000)
推荐阅读
今朝手机等移动设备网站开辟已经有比较好的解决筹划,一种是响应式网站,像笔者博客一样,PC网站就是移动网站,一种是把移动网站和PC网站分开,类似淘宝那样。大年夜网站搜刮引擎优化的角>>>详细阅读
本文标题:JavaScript与异步编程
地址:http://www.17bianji.com/lsqh/36197.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示