Promise是异步编程的一种解决方案,比传统的解决方案-回调函数和事件-更合理更强大
Promise是一个对象,从它可以获取到异步操作的消息,它有如下两个
特点
(1)对象的状态不受外界的影响。有三种状态1.pending进行中2.fulfilled已成功3.rejected已失败
(2)对象的状态一旦改变就不会再变。这就是比事件好的地方,事件的特点就是一旦你错过了他,再去监听,是得不到结果的。
优点 :
(1)有了Promise对象,就可以将一部操作以同步操作的流程表达出来,避免层层嵌套的回调函数。
(2)Promise提供了统一的接口,是的一部操作更加容易。
缺点:
(1)无法取消Promise,一旦新建它就会立即执行,无法中途取消
(2)如果不设置回调函数,Promise内部抛出错误,不会反映到外部
(3)当处于pending时无法得知进行到哪一个阶段(刚刚开始还是即将完成)
如果某些事件不断地反复发生,一般来说,使用 Stream 模式是比部署Promise
更好的选择。--- Stream ?
假如有同步与异步操作,那么在同步操作完成前,异步操作已经完成,那么异步操作的结果什么时候返回?中断,还是等所有同步操作完成?答案是:本轮事件循环的末尾执行。
Promise.prototype.then()方法在promise对象的异步结果返回后才会执行
new Promise(function(resolve,reject){}).then(function) promise对象返回正确结果的回调函数
new Promise(function(resolve,reject){}).then(function).catch()
Promise.prototype.catch(function) promise对象返回的错误结果的回调函数,或者是.then()运行中发现错误,也会被catch捕获
一般来说,Promise对象后面总是要跟catch方法,这样可以处理Prominse对象内部发生的错误
Promise.prototype.finally() promise对象最终都会执行这个方法
Promise.all()
const p = Promise.all([p1, p2, p3]);
上面代码中,Promise.all
方法接受一个数组作为参数,p1
、p2
、p3
都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve
方法,将参数转为 Promise 实例,再进一步处理。(Promise.all
方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。)
Promise.resolve()将现有的对象转为Promise对象
Promise的应用
1.加载图片
2.Promise.try()可以不用区分函数是同步函数或者是异步函数,使他们拥有相同的API
Promise.try(() => database.users.get({id: userId}))
.then(...)
.catch(...)
事实上,Promise.try
就是模拟try
代码块,就像promise.catch
模拟的是catch
代码块