Promise
Promise是什么
-
Promise是异步编程的一种解决方案: 从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。 promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。 -
调用then方法,then方法返回的是
Promise对象,对象状态由回调函数的结果决定- 1.如果回调函数返回的结果是非promise类型的属性,状态为成功,返回值为对象的成功值
- 2.如果回调函数返回的结果是promise,状态根据prmoise返回的状态决定
- 3.如果回调函数throw error,那么状态就是reject
all/race区别
Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。- 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
- 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。
async await
实现原理
- async 函数的实现原理是将
Generator函数和自动执行器,包装在一个函数里。
- Async 声明一个异步函数
(async function someName(){...}) - 自动将常规函数转换成Promise,返回值也是一个Promise对象
- 只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数
- 异步函数内部可以使用await
- Await—暂停异步的功能执行
(var result = await someAsyncCall();) - 放置在Promise调用之前,await强制其他代码等待,直到Promise完成并返回结果
- 只能与Promise一起使用,不适用与回调
优点
- 代码读起来更加同步,Promise虽然摆脱了回调地狱,但是then的链式调用也会带来额外的阅读负担 Promise传递中间值非常麻烦,而
async/await几乎是同步的写法,非常优雅a。 错误处理友好,async/await可以用成熟的try/catch,Promise的错误捕获非常冗余, 由于没有代码块,你不能在一个返回表达式的箭头函数中设置断点,如果你在一个.then代码块中使用调试器的步进(step-over)功能,调试器并不会进入后续的.then代码块,因为调试器只能跟踪同步代码的『每一步』。