promise 的作用
promise 我们异步编程经常在使用,主要用来解决
- 多个异步串行问题,链式调用(还是基于回调)
1
2
3
4
5ajax(v=>{
ajax(v,t=>{
...
})
}) - 多个异步并发,同时拿到结果 promise.all
promise 的特性
- promise 有三个状态 resolve reject pending ,其中只有等待状态才可以改成成功或者失败
- 每个 promise 需提供一个 executor,这个函数立即执行,会返回一个 promise 实例
举个例子
1 | new Promise(() => { |
其中
1 | () => { |
就是 executor,会立即执行,只有 then 才是异步
- executor 上有成功(resolve)和失败的方法(reject)
- new promise 返回 promise 实例,实例上存在 then 方法
简易版 promise
基于上面 promise 那些特性,我们来实现一个(promise/A+规范)[https://promisesaplus.com/]
1.同步 promise
1 | const PENDING = "PENDING"; |
2.异步 promise
可以看出来,上述代码虽然实现了 promise 最基础的功能,但是不支持异步,要支持异步就用到了我们的发布订阅者模式,实现如下
1 | const PENDING = "PENDING"; |
至此一个简易版的 promise 就实现,但是此 promise 并不支持链式调用。
完善版 promise
1.链式调用
1 | const RESOLVE = "RESOLVE"; |
Promise 上方法的实现
1.Promise.resolve
返回一个成功解析的 promise
1 | Promise.resolve= function(val){ |
2.Promise.reject
1 | Promise.reject = function (reason) { |
3.Promise.defer
延迟方法,用来吧异步方法编程 promise 对象
1 | Promise.defer = function () { |
4.Promise.all
并发,可以传普通值,方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败的原因是第一个失败 promise 的结果。
1 | function isPromise(promise) { |
5.finally
finally() 方法返回一个 Promise。在 promise 结束时,无论结果是 fulfilled 或者是 rejected,都会执行指定的回调函数。这为在 Promise 是否成功完成后都需要执行的代码提供了一种方式。
这避免了同样的语句需要在 then()和 catch()中各写一次的情况。
1 | //finally参数是回调 |