**Promise**: ES6新增的对象,用于**异步操作**,表示一个尚未完成预计在未来完成的操作。
JavaScript的执行环境是「单线程」的。所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它会「阻塞」其他任务。这个任务可称为主线程。但实际上还有其他线程,如事件触发线程、ajax请求线程等。因为javascript的单线程原理,使得网络操作,浏览器事件,都必须是异步执行的。
同步模式:即上述所说的单线程模式,一次只能执行一个任务,函数调用后需等到函数执行结束,返回执行的结果,才能进行下一个任务。如果这个任务执行的时间较长,就会导致「线程阻塞」。
同步模式比较简单,也较容易编写。但问题也显而易见,如果请求的时间较长,而阻塞了后面代码的执行,体验是很不好的。因此对于一些耗时的操作,异步模式则是更好的选择。
异步模式:即与同步模式相反,可以一起执行多个任务,函数调用后不会立即返回执行的结果,如果任务A需要等待,可先执行任务B,等到任务A结果返回后再继续回调。
最常见的异步模式就数定时器了,例:
setTimeout(function () {
console.log('Asy')
},0)
console.log('Sy')
// 打印:
// Sy
// Asy
// 即使延时时长为0,Asy依旧晚于Sy;因为定时器是异步的,异步任务会在当前脚本所有同步任务完成之后才被执行。
// 如果同步任务中含有阻塞任务,那么Asy将不会被执行。
Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调。
使用Promise,我们就可以利用then进行「链式回调」,将异步操作以同步操作的流程表示出来。
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。
**Promise 三种状态**
Promise链式调用用到resolve,reject,then,catch,他有以下三种状态
pending - 进行中,或者等待中,表示还没有得到结果;初始值,不是fulfilled,也不是rejected
fulfilled - 已成功,在异步操作成功时调用,并将结果作为参数传递出去。
rejected - 已失败。在异步操作失败时调用,并将报出的错误作为参数传递出去。
Promise有两种状态改变的方式,既可以从pending转变为fulfilled,也可以从pending转变为rejected。一旦状态改变,就「凝固」了,会一直保持这个状态,不会再发生变化。当状态发生变化,promise.then绑定的函数就会被调用。
注意:Promise一旦新建就会「立即执行」,无法取消。这也是它的缺点之一。
*** 基本API**
1. **.then()**
语法: Promise.prototype.then( onFulfilled, onRejected )
2. **.catch()** - 抛出异常
语法: Promise.prototype.catch( onRejected )
其他,后面在慢慢补充,一步步慢慢来,慢慢消化