乐趣区

关于promise:前端笔记Promise

Promise executor

Promise 对象的结构器(constructor)语法如下:

let promise = new Promise(function(resolve, reject) {// executor(生产者代码)});

传递给 new Promise 的函数被称为 executor。当 new Promise 被创立,executor 会主动运行,它蕴含最终应产出后果的生产者代码。
new Promise 结构器返回的 promise 对象具备以下外部属性:

  • state — 最后是 "pending",而后在 resolve 被调用时变为 "fulfilled",或者在 reject 被调用时变为 "rejected"

  • result — 最后是 undefined,而后在 resolve(value) 被调用时变为 value,或者在 reject(error) 被调用时变为 error

留神:

  • executor 只能调用一个 resolve 或一个 reject。任何状态的更改都是最终的。后续的 resolvereject 的调用都会被疏忽。

  • resolve/reject 只须要一个参数(或不蕴含任何参数),并且将疏忽额定的参数

  • Resolve/reject 能够立刻进行:executor 通常是异步执行某些操作,并在一段时间后调用 resolve/reject,但这不是必须的。能够立刻调用 resolvereject

  • Promise 对象的 stateresult 属性都是外部的,无奈间接拜访它们。但能够对它们应用 .then/.catch/.finally 办法。

Promise then

promise.then(function(result) {/* handle a successful result */},
 function(error) {/* handle an error */}
);

.then 的第一个参数是一个函数,该函数将在 promise resolved 后运行并接管后果。
.then 的第二个参数也是一个函数,该函数将在 promise rejected 后运行并接管 error。

  • .catch(f) 调用是 .then(null, f) 的齐全的模仿,它只是一个简写模式。
  • .finally(f):在某种意义上,f 总是在 promise 被 settled 时运行:即 promise 被 resolve 或 reject。

    1. finally 处理程序(handler)没有参数。
    2. finally 处理程序将后果和 error 传递给下一个处理程序

Promise 链

.then(handler) 中所应用的处理程序(handler)能够创立并返回一个 promise。

在这种状况下,其余的处理程序(handler)将期待它 settled 后再取得其后果(result)

  • 确切地说,处理程序(handler)返回的不齐全是一个 promise,而是返回的被称为“thenable”对象,一个具备办法 .then 的任意对象。它会被当做一个 promise 来看待。

  • JavaScript 查看会由 .then 处理程序(handler)返回的对象:如果它具备名为 then 的可调用办法,那么它将调用该办法并提供原生的函数 resolvereject 作为参数(相似于 executor),并期待直到其中一个函数被调用。

  • 作为一个好的做法,异步行为应该始终返回一个 promise

Promise 错误处理

  • 当一个 promise 被 reject 时,控制权将移交至最近的 rejection 处理程序(handler)。

  • Promise 的执行者(executor)和 promise 的处理程序(handler)四周有一个“隐式的 try..catch”。如果产生异样,异样会被捕捉,并被视为 rejection 进行解决

  • 如果在 .catchthrow,控制权就会被移交到下一个最近的 error 处理程序(handler)。如果解决该 error 并失常实现,那么将持续到最近的胜利的 .then 处理程序(handler)

Promise API

Promise 类有 5 种静态方法:

  1. Promise.all(promises) —— 期待所有 promise 都 resolve 时,返回寄存它们后果的数组。如果给定的任意一个 promise 为 reject,那么它就会变成 Promise.all 的 error,所有其余 promise 的后果都会被疏忽。

  2. Promise.allSettled(promises)(ES2020 新增办法)—— 期待所有 promise 都 settle 时,并以蕴含以下内容的对象数组的模式返回它们的后果:

    • status: "fulfilled""rejected"
    • value(如果 fulfilled)或 reason(如果 rejected)。

  3. Promise.race(promises) —— 期待第一个 settle 的 promise,并将其 result/error 作为后果。

  4. Promise.resolve(value) —— 应用给定 value 创立一个 resolved 的 promise。

  5. Promise.reject(error) —— 应用给定 error 创立一个 rejected 的 promise。
退出移动版