export function parseResponse(res) {
return new Promise((resolve, reject) => {
let responseData = res.data;
if (responseData.code >= 200 && responseData.code < 300) {
if (resolve) {
resolve(responseData);
}
} else {
if (reject) {
reject();
} else {
console.log(responseData);
alert(responseData.message);
}
}
}
);
}
就完整的用法肯定是这么写的嘛:
parseResponse(res).then(()=>....).catch(()=>....)
但我现在很多地方在使用的时候,catch 所接收的函数,其实都是做同一件事,也就是这里的
console.log(responseData);
alert(responseData.message);
那我就想让这样的地方可以不写 catch,即不写就是执行上面这段代码。
然而 if(reject)
的方法不行。不知道可行的方法是怎么样的。谢谢。
1
kurisu1901 2021-03-29 16:59:54 +08:00 1
你对 Promise 的理解有点问题,resolve 和 reject 这两个参数是系统传入的,无论什么时候都是真值,if (resolve/reject) 这种写法是没意义的,你手动调用 resolve()/reject()或者发生异常了才会让 promsie 进入最终状态。你代码里的 reject()执行完之后,后面的代码就不会执行了。
改成这样应该就行了,再看看 Promise 的 API 描述吧 ``` function parseResponse(res) { return new Promise((resolve, reject) => { let responseData = res.data; if (responseData.code >= 200 && responseData.code < 300) { resolve(responseData); } else { console.log(responseData); alert(responseData.message); reject(responseData.message) } } ); } ``` |
2
codder 2021-03-29 17:03:41 +08:00
.catch 是一定要有的,嫌麻烦可以将错误输出封装成函数,如果是 axios 获取一部请求可以在配置里拦截错误,这样正常写的时候就不用捕获错误就不用写 catch 了
|
3
Shook 2021-03-29 17:05:50 +08:00 1
一般请求模块,会有设置拦截器的方法。
比如 axios,直接设置`axios.interceptors.response.use`,在响应错误时调用`alert()`就好了。 如果请求模块不自带这样的功能,可以自己封装一个请求方法。 一个`async/await`请求封装如下,`config`也可替换为 Promise,差不多: async function request(config) { --const { data: { error, message } } = await http(config); --if (!error) { ----return response; --} else { ----console.error(message); ----throw response; --} } |
4
Yumwey 2021-03-29 17:07:05 +08:00
if ( reject )是啥东西...
你直接在 else 里写你的公共逻辑,或者在 parseResponse 给个 cb,在 else 中调用不就行了? 比如: else { cb && cb.call() // 公共部分 reject() } |
5
Shook 2021-03-29 17:07:17 +08:00
--const response = await http(config);
--const { data: { error, message } } = response; |
6
wgbx 2021-03-29 17:15:24 +08:00
1 楼说的差不多了,promise 你真的需要重新看一遍,promise 异步调用的面试题还挺多的
|
7
cydysm 2021-03-29 17:23:56 +08:00
既然 promise reject 时都是大多是做同样的事情,那不如传入个 callback,尽管看起来很怪
export function parseResponse(res,flag) { return new Promise((resolve, reject) => { let responseData = res.data; if (responseData.code >= 200 && responseData.code < 300) { if (resolve) { resolve(responseData); } } else { callback && callback() reject(); } } ); } |
8
cyrbuzz 2021-03-30 10:51:39 +08:00
```
function parse(res) { a = Promise.resolve(res) const then = function (func, rej) { if (!rej) { rej = () => { console.log(1); alert(1); } } a = a.then((res) => { return new Promise((resolve, reject) => { try { resolve(func(res)) } catch(e) { reject('err') } }) }).catch(rej) return thenObj } const thenObj = { then: then } return thenObj } parse({test: 'test'}).then((item) => { console.log(item) return item }).then((item) => { console.log(item) throw 'error' }) ``` 可以封装一下 `.then`。 |