前端笔记 - Promise

Posted tanyioO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端笔记 - 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。

以上是关于前端笔记 - Promise的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段12——JavaScript的Promise对象

《深入理解ES6》笔记—— Promise与异步编程

前端片段整理

Promise学习笔记

笔记HybridApp中使用Promise化的JS-Bridge