Promise 通常被定义为最终会变为可用值的代理,是一种处理异步代码的方式。

运作方式

promise被调用后,它会以处理中状态开始。 这意味着调用的函数会继续执行,而promise仍处于处理中直到解决为止,从而为调用的函数提供所请求的任何数据。
被创建的promise最终会以被解决状态被拒绝状态结束,并在完成时调用相应的回调函数(传给 thencatch)。
可以把promise简单理解成一个容器,存放着某个未来才会结束的事件的结果(通常是一个异步操作)。通过promise对象来获取异步操作消息,处理各种异步操作。

特点

  • 对象的状态不受外界影响,只与异步操作的结果有关。

    Promise对象代表一个异步操作,有三种状态:**pending**(进行中)**fulfilled**(已成功)和**rejected**(已失败)只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

  • 一旦状态改变,就不会再变,任何时候都可以得到这个结果

    Promise对象的状态改变,只有两种可能:从**pending**变为**fulfilled**和从**pending**变为**rejected**。只要这两种情况发生,状态就不会再变了,会一直保持这个结果,这时就称为**resolved**(已定型)。如果改变已经发生了,再对**Promise**对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

基本使用

Promise为一个构造函数,需要用new来实例化。

  1. let p = new Promise((resolve, reject) => {
  2. if(/*异步操作成功*/){
  3. resolve(value);
  4. } else {
  5. reject(error);
  6. }
  7. })
  • resolve作用是将Promise的状态从pending变成resolved在异步操作成功时调用返回异步操作的结果作为参数传递出去
  • reject作用是将Promise的状态从pending变成rejected,在异步操作失败时报错,作为参数传递出去。
  • 如果在执行路径中从未调用过这些函数之一,则promise会保持pending状态。

Promise实例生成以后,可以用.then()方法将参数中的函数添加到当前 Promise 的正常执行序列,分别指定resolved状态和rejected状态的回调函数。

  1. p.then(function(val){
  2. // success...
  3. },function(err){
  4. // error...
  5. })

resolve()中可以放置一个参数用于向下一个then传递一个值then中的函数也可以返回一个值传递给 then

  1. new Promise(function (resolve, reject) {
  2. console.log(1111);
  3. resolve(2222);
  4. }).then(function (value) {
  5. console.log(value);
  6. return 3333;
  7. }).then(function (value) {
  8. console.log(value);
  9. throw "An error";
  10. }).catch(function (err) {
  11. console.log(err);
  12. });
  13. // 1111
  14. // 2222
  15. // 3333
  16. // An error

如果then中返回的是一个Promise对象,那么下一个then将相当于对这个返回的Promise进行操作。

简单辨析

不使用promise,令ajax同步(async: false),阻塞了下面:
image.png
image.png
使用promise,异步。
image.png
image.png

参考: https://www.bilibili.com/video/BV1ch411k7Ud https://www.runoob.com/js/js-promise.html http://js.pingan8787.com/