簡體   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