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