繁体   English   中英

如何将'Promise.reject`视为一流的功能?

[英]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。

  1. C为该值。
  2. 如果Type( C )不是Object,则抛出TypeError异常。
  3. promiseCapability成为? NewPromiseCapability( C )。
  4. 表演? 调用( promiseCapability 。[[Reject]],undefined,«r»)。
  5. 返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM