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

dca*_*tro 3 javascript promise

我为什么这样做:

> Promise.reject(3);
< Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: 3}
Run Code Online (Sandbox Code Playgroud)

但不是这个:

> var f = Promise.reject;
< undefined

> f(3)
< VM2366:1 Uncaught TypeError: PromiseReject called on non-object
    at reject (<anonymous>)
    at <anonymous>:1:1
Run Code Online (Sandbox Code Playgroud)

Frx*_*rem 5

规范定义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函数期望其this值是一个构造函数,它支持构造函数的参数约定Promise.

正如您所知,Promise.reject期望在Promise构造函数(本机承诺或其他兼容实现)上调用.当把它Promise.reject当作类的第一类函数来处理时,你在全局对象上调用它,它不是一个Promise构造函数,因此失败了.1

如果你需要以Promise.reject这种方式使用,我建议先绑定它:

var f = Promise.reject.bind(Promise);
f(3); // Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: 3}
Run Code Online (Sandbox Code Playgroud)

1我不确定为什么全局对象不被视为对象,但是,因为Promise.reject.call({ })给出了Uncaught TypeError: object is not a constructor.