es6新特性promise详解(ES6的重中之重Promise的用法)

简介
本文只是针对对Promise有一定掌握的人士,列举了Promise需要记住和掌握的关键点,不是讲Promise的基础知识。

es6新特性promise详解(ES6的重中之重Promise的用法)(1)

执行时机

Promise新建后会立即执行,同步的,但是resolved和rejected的回调函数是异步的, 但是它的回调是放在本轮循环的末尾执行,并不是放到下次事件循环中执行。

Promise三种状态
  • pending (进行中)

  • fulfilled (已成功)

  • rejected (已失败)

三种状态只能是由pending到fulfilled,或由rejected到rejected。状态一旦改变,不会再变。 在状体改变后再添加回调函数仍能立即得到结果,这是与事件的区别,事件结束再去监听,是得不到结果的。

Resolve
  • 参数会传递给then回调函数

  • 和rejected都不会终止后续代码执行,resolved后面的代码仍会执行,除非在resolved时return

  • 当resolved的参数是一个promise实例时,会等待上一个promise的状态返回

Rejected
  • 参数传递给回调函数

  • 参数通常是Error对象的实例

  • 运行抛出异常,状态也会变为Rejected

catch
  • 不仅状态变为rejected时会触发,运行中抛出的错误也会被catch捕获

  • resolve之后抛出的异常,不会被捕获,状态只会更改一次,更改后就不会改变。

  • “冒泡”性质,一直向后传递,直到被捕获。也就是说错误肯定会被后面的catch捕获。

  • 如果不写catch,promise有错误时,不会有任何反应,不会退出进程、终止脚本执行,promise和外部代码“隔离”(未来可能更改这规则)

  • 后面可以继续跟then和catch

then
  • 返回的是一个新的promise对象,不是原来的

  • 不推荐传rejected回调函数,这样无法捕获resolved回调函数中的错误

  • 如果函数中返回的是一个promise,则后面的then会等待这个promise的结果

finally
finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。

与状态无关的,resolved或rejected了都会触发finally(底层也是这么实现的);但如果promise没有返回resolved或rejected是不会执行的。

Promise.all()

Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

  • 自动把包装的实例转化成promise实例

  • 包装的promise实例都resolved了它就resolved

  • 有一个rejected,它就rejected

  • 如果容器中的实例有自己的catch,则不会触发all的catch

因为catch返回是一个新的promise,catch已经处理了错误,返回的promise是resolved的,所以对all来说是两个resolved的实例

Promise.race()
和all类似,只是它是有一个实例率先改变状态了,它的状态就改变了。Promise.resolve()
把对象转换成promise对象

参数是一个 Promise 实例

原封不动地返回这个实例。

参数是一个thenable对象

thenable对象指的是具有then方法的对象,比如下面这个对象。

let thenable = { then: function(resolve, reject) { resolve(42); } };

resolve会立即执行then方法,然后返回一个resolved的promise对象

参数不是具有then方法的对象,或根本就不是对象

返回一个状态是resolved的promise对象

不带有任何参数

直接返回一个resolved状态的 Promise 对象。(注意promise回调的执行时机)Promise.reject()
返回一个状态为rejected的promise对象

Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数。这一点与Promise.resolve方法不一致

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页