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

时间:2017-06-05 10:39:18

标签: javascript promise

为什么我可以这样做:

id

但不是这样:

time_stamp

2 个答案:

答案 0 :(得分:5)

spec定义Promise.reject如下(强调我的):

  

25.4.4.4 Promise.reject( r )

     

reject函数返回一个被传递的新promise   参数。

     
      
  1. C 为此值。
  2.   
  3. 如果Type( C )不是Object,则抛出TypeError例外。
  4.   
  5. promiseCapability 成为? NewPromiseCapability( C 的)。
  6.   
  7. 表演?调用( promiseCapability 。[[Reject]],undefined,«r»)。
  8.   
  9. 返回 promiseCapability 。[[承诺]]。
  10.         

    注意: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

答案 1 :(得分:0)

我认为这是因为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);