异步编程有哪几种方法来实现?

1.背景介绍

JavaScript作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。 所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个。 这样一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务。 好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。

为了解决这个问题,Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。

“同步模式"指后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的。

"异步模式"则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务, 而是执行回调函数,后一个任务则是不等前一个任务结束就执行, 所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

2.知识剖析

异步编程方法

异步编程的主要方式是使用回调函数,但是回调函数嵌套形成Callback Hell问题。 Callback Hell 最大的问题是不好写、不好看,以及衍生出来的不好管理,这样的代码不易阅读、管理、重构困难、没有灵活性。

无论是 Promise 还是 generator,亦或者是 async/await,他们所做的任务都是要千方百计地把Callback Hell拉成平整的线性结构,加入语法糖。

1 回调函数 2 事件监听 3 Promise 4 Generation 5 async/await

1 回调函数

异步编程最基本的方法。

假定有两个函数f1和f2,f2等待f1的执行结果。如果f1是一个很耗时的任务,可以考虑改写f1,把f2写成f1的回调函数。

                    
                        function f1(callback){
                                setTimeout(function () {                      
                                  // f1的任务代码                       
                                  callback();                            
                                }, 1000);                        
                              }
                        f1(f2);
                    
                

2 事件监听

另一种思路是采用事件驱动模式。任务的执行不取决于代码的顺序,而取决于某个事件是否发生。

                                            
                        clickEvent.addEventListener("click", function (e) {
                        console.log("someone is pressing my buttons…");
                        });
                    
                

3.常见问题

回调地狱怎么解决

4.解决方案

1 事件监听

2 Promise

Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。Promise是后面新技术的基础,堪称一切异步方案的粘合剂。

5.编码实战

// 证明单线程的一个例子:
var d = new Date;

setTimeout(function () {
  console.log(new Date - d);
}, 1000);

while (true)
  if (new Date - d > 3000) break;

console.log(new Date - d);
// 一个定时器
function timer(time, callback) {
  setTimeout(function () {
    callback();
  }, time);
}

timer(3000, function () {
  console.log(123);
})

console.log(new Date - d);


setTimeout(function () {

  console.log(123);

}, 3000);
console.log(new Date - d);

setTimeout(function () {

  console.log(1);
  console.log(new Date - d);
  setTimeout(function () {

    console.log(2);
    console.log(new Date - d);
    setTimeout(function () {

      console.log(3);
      console.log(new Date - d);
      setTimeout(function () {

        console.log(4);
        console.log(new Date - d);
      }, 3000);
    }, 3000);
  }, 3000);
}, 3000);
console.log(new Date - d);

6.扩展思考

7.参考文献

参考一  5分种让你了解javascript异步编程的前世今生,从onclick到await/async

参考二  深入解析Javascript异步编程

参考三  最后谈一次 JavaScript 异步编程

8.更多讨论

问:什么时候使用异步编程

答: 任务耗时很长,后面的任务都必须排队

问:异步编程有几种方法

答:1 回调函数 2 事件监听 3 Promise 4 Generation 5 async/await

问:promise是什么

答:Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。Promise是后面新技术的基础,堪称一切异步方案的粘合剂。


技能树.IT修真院   

 “我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。

 
快来与我一起学习吧~邀请链接  点击打开链接

猜你喜欢

转载自blog.csdn.net/zach90/article/details/81003792