Promise 对象
- 参数是带有 resolve 和 reject 两个参数的函数,在 resolve 和 reject 函数被调用时分别将 promise 的状态改为
fulfilled和rejected
-
有三种状态:
pending(进行中)、fulfilled(已成功)、rejected(已失败)- 只有异步操作的结果,可以决定当前是哪一种状态
- 一旦状态改变,就不会再变
-
缺点
- 无法取消
- promise 内部的错误不会反应到外部
- 当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
-
promise.then()
- 链式调用
- 有两个参数 resolve 和 reject 该参数作为回调函数被调用;如果传入的 resolve 参数类型不是函数,则会在内部被替换为
(x) => x,即原样返回 promise 最终结果的函数 - 回调函数中可传参数,如果想要在回调中获取上个 promise 中的结果,上个 promise 中必须要返回结果。
-
promise.catch()
- 是
then(null,reject)的缩写 - 一般来说,不要在 then 方法里面定义 Reject 状态的回调函数(即 then 的第二个参数),总是使用 catch 方法。
- Promise 对象的错误具有
“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个 catch 语句捕获。捕获之后还可以继续使用链式操作 - Promise 内部的错误不会影响到 Promise 外部的代码
- 是
-
promise.all()
- 参数为一个可迭代的对象
- 在所有的 promise 都完成或有一个 promise 失败时异步地返回一个变为完成或失败状态的 promise
- 返回值将会按照参数内的 promise 的顺序排列,而不是由调用 promise 的完成顺序决定
- 当且仅当传入的可迭代对象为空时为同步
- 如果参数中包含非 promise 值,会调用 Promise.resolve 方法,将参数转为 Promise 实例,再进一步处理。
- 如果作为参数的 Promise 实例,自己定义了 catch 方法,那么它一旦被
rejected,并不会触发 Promise.all()的 catch 方法。
-
promise.race()
- 参数为一个可迭代的对象
- 一旦迭代器中的某个 promise 解决或拒绝,返回的 promise 就会解决或拒绝
- 如果传的迭代是
空的,则返回的 promise 将永远等待。
-
promise.resolve()
-
可将现有对象转为 promise 对象
-
参数分为四种情况
- 参数为一个 promise 实例
- 参数是一个 thenable 对象
- 参数为一个 value 值(一个不具有 then 方法的对象),直接返回一个 resolve 状态的 promise
- 参数为空,直接返回一个 resolve 状态的 promise
-
立即 resolve 的 Promise 对象,是在本轮“事件循环”(
event loop)的结束时,而不是在下一轮“事件循环”的开始时。
-
-
promise.reject()
- Promise.reject()方法的参数,会原封不动地作为 reject 的理由,变成后续方法的参数。这一点与 Promise.resolve 方法不一致。
-
promise.finally()
- Promise 在执行 then()和 catch()后,都会执行 finally 指定的回调函数。避免同样的语句需要在 then()和 catch()中各写一次的情况。
- 不接受参数,因为无法知道 promise 的状态。因此 finally 方法里面的操作,应该与状态无关,不依赖 promise 的结果
-
promise.try()
- 目前是提案状态
- 应用场景:不知道或者不想区分,函数 f 是同步函数还是异步操作,但是想用 Promise 来处理它。因为这样就可以不管 f 是否包含异步操作,都用 then 方法指定下一步流程,用 catch 方法处理 f 抛出的错误。
-
参考文档