[英]How to treat `Promise.reject` as a first-class function?
我为什么这样做:
> Promise.reject(3);
< Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: 3}
但不是这个:
> var f = Promise.reject;
< undefined
> f(3)
< VM2366:1 Uncaught TypeError: PromiseReject called on non-object
at reject (<anonymous>)
at <anonymous>:1:1
该规范将Promise.reject
定义如下(强调我的):
25.4.4.4
Promise.reject( r )
reject函数返回一个被传递的参数拒绝的新promise。
- 设C为该值。
- 如果Type( C )不是Object,则抛出
TypeError
异常。- 让promiseCapability成为? NewPromiseCapability( C )。
- 表演? 调用( promiseCapability 。[[Reject]],undefined,«r»)。
- 返回promiseCapability 。[[Promise]]。
注意:
reject
函数期望它的这个值是一个构造函数,它支持Promise
构造函数的参数约定。
从这里可以看出, Promise.reject
期望在Promise构造函数(本机promise或其他兼容实现)上调用。 当将Promise.reject
视为类似的第一类函数时,您将在全局对象上调用它,而该对象不是Promise构造函数,因此失败。 1
如果你需要以这种方式使用Promise.reject
,我建议先绑定它:
var f = Promise.reject.bind(Promise);
f(3); // Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: 3}
1我不完全确定为什么全局对象不被视为对象,因为Promise.reject.call({ })
给出了Uncaught TypeError: object is not a constructor
。
我相信这是因为reject
被定义为Promise对象上的静态函数。
因此,您不能像上面那样调用它,因为它直接在类上调用,而不是在类的实例上调用。
有关静态函数的详细信息以及何时可以在此处调用它们:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static
你可以将它包装在一个函数中:
function promiseReject(x) {
return Promise.reject(x);
}
var f = promiseReject;
var out = f(3);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.