[英]Returning Promise in JavaScript es6
假設我有一個文件從api導入函數並對結果執行某些操作。
import api from './api'
const getData = () => {
api.get(url)
.then(res => console.log(res))
.catch(err => console.log(err))
}
我已經看到兩種不同的樣式用於返回響應,因此錯誤起泡。
版本1:
get: (url) => {
return new Promise((resolve, reject) => axios.get(url)
.then(res => resolve(res))
.catch(err => reject(err)) )
}
版本2:
get: (url) => {
return axios.get(url)
.then(res => {
if (res.success == 200) {
return Promise.resolve(res)
}
return Promise.reject(res)
})
}
這兩種方法有什么區別? 是否有一個首選/更好的錯誤處理方法?
一般來說,兩個方便的規則:
如果你的起點是一個promise( axios.get
的返回值),那么使用new Promise
就是一種反模式。 then
catch
已經創造了新的承諾。
傳播錯誤,不要將它們轉換為分辨率(當然,直到處理這些錯誤的點,通常在調用鏈的開頭附近)。
基於此,在這兩個選項中,您將使用版本2,而不是版本1。
版本1有點荒謬:它吃分辨率值並將錯誤轉換為分辨率; 它將始終解析為undefined
。 請記住,鏈的結果是在then
或catch
處理程序中返回(或拋出)的最后一個結果。 這兩個處理程序不返回或拋出任何東西,因此鏈解析(而不是拒絕) undefined
。
版本2執行某些操作:它根據res.success
修改承諾結果。 但它不需要Promise.resolve
,它應該只是:
get: (url) => axios.get(url).then(res => {
if (res.success == 200) {
return res;
}
return Promise.reject(res); // Or see note below
})
還有一個陣營 - 我同意 - 它說你應該總是拋出一個Error
對象,而不是返回Promise.reject
,用於堆棧跟蹤信息。 所以:
get: (url) => axios.get(url).then(res => {
if (res.success == 200) {
return res;
}
throw new Error(res/*...or something else useful here...*/);
})
兩個版本沒有真正的區別,在第一個版本中,您創建了一個冗余的Promise
。
axios.get
,是一個返回Promise
的函數,不需要用另一個包裝它。
如果你想改變承諾邏輯,你可以使用額外的Promise
扭曲,這意味着如果你想解決無論在axios承諾中發生了什么。 像這樣的東西:
get: (url) => {
return new Promise((resolve, reject) => axios.get(url)
.then(res => resolve(res))
.catch(err => resolve(err)) )
}
但是,通常不是這種做法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.