假设我有一个文件从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)
})
}
这两种方法有什么区别?是否有一种首选/更好的错误处理方法?
答案 0 :(得分:2)
一般来说,有两个方便的规则:
如果您的起点是承诺(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...*/);
})
答案 1 :(得分:0)
这两个版本没有什么区别,在第一个版本中,您创建的是冗余Promise
。
axios.get
,是一个返回Promise
的函数,不需要用另一个函数包装它。
如果你想改变承诺逻辑,你可以使用额外的Promise
进行扭曲,这意味着如果你想解决无论在axios承诺中发生了什么。
这样的事情:
get: (url) => {
return new Promise((resolve, reject) => axios.get(url)
.then(res => resolve(res))
.catch(err => resolve(err)) )
}
但是,通常不是这种做法。