分享人:马扬睿
目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
一个 Promise 就是一个代表了异步操作最终完成或者失败的对象。主要用于异步计算,表示一个现在将来或者永远不可能用到的值。
promise如果按用途来解释的话
1:主要用于异步计算
2:主要用于异步操作队列化,按照期望的顺序执行,返回预期的结果
3:可以在对象之间传递和操作promise,帮助我们处理队列
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
同步操作有什么缺点呢?
比如你去了一个饭店,想点菜,让服务员给你拿个菜单
服务员说好的,等这桌吃完了我服务完这一桌就给你拿
你是不是很生气,我只是拿个菜单而已
这就是同步操作的缺点,如果有一个非常耗时的操作,那么后面的进程都无法进行了
所以"异步模式"非常重要。在浏览器端,耗时很长的操作都应该异步执行,避免浏览器失去响应,最好的例子就是Ajax操作。
$.ajax({ success:function(res1){
//------请求B 开始---- $.ajax({ success:function(res2){
//----请求C 开始--- $.ajax({ success:function(res3){ } });
//---请求C 结束--- } }); //------请求B 结束-----
} }); //------请求A 结束---------
但是这样写,会有一些缺点:
1. 如果存在多个请求操作层层依赖的话,那么以上的嵌套就有可能不止三层那么少了,加上每一层还会有复杂的业务逻辑处理,代码可读性也越来越差,不直观,调试起来也不方便。如果多人开发的时候没有足够的沟通协商,大家的代码风格不一致的话,更是雪上加霜,给后面的维护带来极大的不便。
2. 如果请求C的需要依赖A和B的结果,但是请求A和B缺互相独立,没有依赖关系,以上的实现方式,就使得B必须得到A请求完成后才可以执行,无疑是消耗了更多的等待时间。
什么是回调地狱?
由于回调函数是异步的,在上面的代码中每一层的回调函数都需要依赖上一层的回调执行完,所以形成了层层嵌套的关系最终形成类似上面的回调地狱,但代码以此种形式展现时无疑是不利于我们阅读与维护的,此时就要想办法改进这种代码形式。
感谢大家观看
BY : 马扬睿