簡體   English   中英

如何將 Promise 的 resolve 和 reject 方法傳遞給其他函數?

[英]How can I pass Promise's resolve and reject methods to other functions?

假設我的應用程序中有一堆 Promise 就像這樣:

const fetchUser = id => new Promise((resolve, reject) => {
  const request = new XMLHttpRequest()
  
  request.open('GET', 'blabla')

  request.onload = () => {
    if (request.status >= 400 && request.status <= 500) {
      reject(Error(JSON.parse(request.responseText)))
    } else {
      resolve(JSON.parse(request.responseText))
    }
  }

  request.onerror = () => reject(Error('There was a problem when fetching a user'))
  
  request.send()
})

這是不好的做法,因為我只是為我所做的每個 Promise 復制並粘貼request.onloadrequest.onerror部分。 所以我可以做這樣的事情:

request.onload = handleLoadedRequest
request.onerror = handleBadRequest

並創建這兩個新函數。 但是,我將如何在這些函數中resolvereject

const handleBadRequest = () => reject(Error('Oops!'))

您可以使用Promise.resolve()Promise.reject()這將立即解決和拒絕 Promise。 當拒絕 Promise 將其包裝在 Error 對象中(如果它還沒有)時,這也是一種很好的做法。 這樣,除其他外,您將擁有堆棧跟蹤。 請參閱 Mozilla 文檔以獲取示例: https : //developer.mozilla.org/en-US/docs/web/javascript/reference/global_objects/promise/reject

我通常將我的 ajax 請求和 XHR 請求包裝在一個返回 Promise 的函數中; 這被稱為承諾。 有關承諾 XHR 的示例,請參閱此帖子: https ://stackoverflow.com/a/30008115/1617161

您實際上並不需要將 resolve 和 reject 函數傳遞給其他函數。 您的其他功能將是解決或拒絕自己的承諾的承諾; 這允許鏈接 Promise。 然后,您在調用鏈中對 Promise 調用 .then() 和 .catch() 以繼續或捕獲錯誤。

只需將 resolve 和 reject 傳遞給 handleLoadedRequest 和 handleBadRequest 函數。

const handleLoadedRequest = (resolve, reject) => () => {
...
}

const handleBadRequest = (resolve, reject) => () => {
...
}

const fetchUser = id => new Promise((resolve, reject) => {
  const request = new XMLHttpRequest()
  
  request.open('GET', 'blabla')

  request.onload = handleLoadedRequest(resolve, reject);

  request.onerror = handleBadRequest(resolve, reject);
  
  request.send()
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM