gpt4 book ai didi

javascript - 在 JavaScript es6 中返回 Promise

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:11:23 24 4
gpt4 key购买 nike

假设我有一个文件,它从 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)
})
}

这两种方法有什么区别?是否有首选/更好的错误处理方法?

最佳答案

一般来说,有两条方便的规则:

  1. 如果您的起点是一个 promise (axios.get 的返回值),那么使用 new Promise 是一种反模式。 thencatch 已经创建了新的 promise 。

  2. 传播错误,不要将它们转化为解决方案(当然,直到您处理这些错误的时间点,通常在调用链的开头附近)。

基于此,在这两个选项中,您将使用版本 2,而不是版本 1。

版本 1 有点荒谬:它吃掉分辨率值并将错误转换为分辨率;它将始终解析为 undefined。请记住,链的结果是 thencatch 处理程序中最后返回(或抛出)的结果。这两个处理程序不返回或抛出任何东西,因此链以 undefined 解析(而不是拒绝)。

版本 2 做了一些事情:它修改了基于 res.success 的 promise 结果。但它不需要 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...*/);
})

关于javascript - 在 JavaScript es6 中返回 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45944860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com