前端笔记 - 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
。任何状态的更改都是最终的。后续的resolve
和reject
的调用都会被忽略。resolve/reject
只需要一个参数(或不包含任何参数),并且将忽略额外的参数Resolve/reject 可以立即进行:executor 通常是异步执行某些操作,并在一段时间后调用
resolve/reject
,但这不是必须的。可以立即调用resolve
或reject
。Promise 对象的
state
和result
属性都是内部的,无法直接访问它们。但可以对它们使用.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。finally
处理程序(handler)没有参数。finally
处理程序将结果和 error 传递给下一个处理程序
Promise链
.then(handler)
中所使用的处理程序(handler)可以创建并返回一个 promise。
在这种情况下,其他的处理程序(handler)将等待它 settled 后再获得其结果(result)
确切地说,处理程序(handler)返回的不完全是一个 promise,而是返回的被称为 “thenable” 对象 , 一个具有方法
.then
的任意对象。它会被当做一个 promise 来对待。javascript 检查会由
.then
处理程序(handler)返回的对象:如果它具有名为then
的可调用方法,那么它将调用该方法并提供原生的函数resolve
和reject
作为参数(类似于 executor),并等待直到其中一个函数被调用。作为一个好的做法,异步行为应该始终返回一个 promise
Promise错误处理
当一个 promise 被 reject 时,控制权将移交至最近的 rejection 处理程序(handler)。
Promise 的执行者(executor)和 promise 的处理程序(handler)周围有一个“隐式的
try..catch
”。如果发生异常,异常会被捕获,并被视为 rejection 进行处理如果在
.catch
中throw
,控制权就会被移交到下一个最近的 error 处理程序(handler)。如果处理该 error 并正常完成,那么将继续到最近的成功的.then
处理程序(handler)
Promise API
Promise
类有 5 种静态方法:
Promise.all(promises)
—— 等待所有 promise 都 resolve 时,返回存放它们结果的数组。如果给定的任意一个 promise 为 reject,那么它就会变成Promise.all
的 error,所有其他 promise 的结果都会被忽略。Promise.allSettled(promises)
(ES2020 新增方法)—— 等待所有 promise 都 settle 时,并以包含以下内容的对象数组的形式返回它们的结果:status
:"fulfilled"
或"rejected"
value
(如果 fulfilled)或reason
(如果 rejected)。
Promise.race(promises)
—— 等待第一个 settle 的 promise,并将其 result/error 作为结果。Promise.resolve(value)
—— 使用给定 value 创建一个 resolved 的 promise。Promise.reject(error)
—— 使用给定 error 创建一个 rejected 的 promise。
以上是关于前端笔记 - Promise的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段12——JavaScript的Promise对象