es6-Promise知识梳理

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方法接受一个数组作为参数,p1p2p3都是 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代码块

你可能感兴趣的:(JavaScript,ES6)