为什么我可以这样做:
id
但不是这样:
time_stamp
答案 0 :(得分:5)
spec定义Promise.reject
如下(强调我的):
25.4.4.4
Promise.reject( r )
reject函数返回一个被传递的新promise 参数。
- 让 C 为此值。
- 如果Type( C )不是Object,则抛出
TypeError
例外。- 让 promiseCapability 成为? NewPromiseCapability( C 的)。
- 表演?调用( promiseCapability 。[[Reject]],undefined,«r»)。
- 返回 promiseCapability 。[[承诺]]。
醇>注意:
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);