共计 2091 个字符,预计需要花费 6 分钟才能阅读完成。
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。