new Promise() - JavaScript Promise 对象
new Promise()
Promise
构造器主要用于包装不支持 promise(返回值不是Promise
)的函数。
语法
new Promise(executor)
参数
executor
该函数将在构造这个新Promise
对象过程中,被构造函数执行。该executor
是一段将输出与 promise 联系起来的自定义代码。executor
的函数签名应为:
function(resolutionFunc, rejectionFunc){ // 通常是一些异步操作 }
resolutionFunc
与rejectionFunc
也是函数,可以使用任何名字。这两个函数的签名很简单:接受任何类型的单个参数。
resolutionFunc(value) // 当被敲定时调用 rejectionFunc(reason) // 当被拒绝时调用
当该 promise 动态插入promise 链的情况下,该resolutionFunc
的value
参数可能是另一个 promise 对象。
关于executor
,需理解以下几点:
- 该
executor
的返回值将被忽略。 - 如果在该
executor
中抛出一个错误,该 promise 将被拒绝。
因此,executor
的代码生效的原理如下:
- 在构造函数生成新
Promise
对象时,构造函数也生成了一对相关的函数resolutionFunc
与rejectionFunc
。他们被绑定在了Promise
对象上。 executor
内的代码有机会执行一些操作,然后通过分别调用resolutionFunc
或者rejectionFunc
,反应这些操作的结果(如果这些结果不是另一个Promise
对象的话),要么为已敲定(resolved),要么为已拒绝(rejected)。- 换句话说,
executor
中的代码通过resolutionFunc
或rejectionFunc
产生的副作用进行通信。这里的副作用是指Promise
对象变成已敲定(resolved),要么为已拒绝(rejected)。
综上所述,对典型流程进行总结:
executor
内的操作是异步的,并且提供一个回调(callback)。- 该回调在
executor
内定义。 - 该回调通过调用
resolutionFunc
终止。 resolutionFunc
的调用包含一个value
参数。- 该
value
被返回给绑定的Promise
对象上。 - 该
Promise
对象(异步地)调用任何相关的.then(handleResolved)
。 .then(handleResolved)
收到的value
作为入参被传递给了handleResolved
的调用。(参见Promise 的链式调用)
返回值
当通过new
调用时,Promise
构造函数返回一个 promise 对象。当resolutionFunc
或者rejectionFunc
被调用时,该 promise 对象将会“被敲定”。注意,如果您调用resolutionFunc
或者rejectionFunc
时将另一个 Promise 对象作为参数,您可以称其“被敲定(resolved)”,但仍不能称其“被解决(settled)”。
例子
我们通过new
关键字和Promise
构造器创建它的对象。这个构造器接受一个名为"executor function"的函数。这个函数应当接受两个函数参数。当异步任务成功时,第一个函数(resolve
)将被调用,并返回一个值代表成功。当其失败时,第二个函数(reject
)将被调用,并返回失败原因(失败原因通常是一个 error 对象)。
const myFirstPromise = new Promise((resolve, reject) => { // do something asynchronous which eventually calls either: // // resolve(someValue) // fulfilled // or // reject("failure reason") // rejected });
为了提供一个拥有 promise 功能的函数,简单的返回一个 promise 即可:
function myAsyncFunction(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest() xhr.open("GET", url) xhr.onload = () => resolve(xhr.responseText) xhr.onerror = () => reject(xhr.statusText) xhr.send() }); }
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!