【JS-task4】 异步编程有哪几种方法来实现?

分享人:陈占乐

目录

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

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.编码实战

demo

6.扩展思考

7.参考文献

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

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

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

8.更多讨论

鸣谢

感谢大家观看

BY : 陈占乐