javascript 请问如何为 Promise 添加默认的 reject 行为?

2021-03-29 16:35:58 +08:00
 Newyorkcity
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) 的方法不行。不知道可行的方法是怎么样的。谢谢。

1241 次点击
所在节点    问与答
8 条回复
kurisu1901
2021-03-29 16:59:54 +08:00
你对 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)
}
}
);
}
```
codder
2021-03-29 17:03:41 +08:00
.catch 是一定要有的,嫌麻烦可以将错误输出封装成函数,如果是 axios 获取一部请求可以在配置里拦截错误,这样正常写的时候就不用捕获错误就不用写 catch 了
Shook
2021-03-29 17:05:50 +08:00
一般请求模块,会有设置拦截器的方法。
比如 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;
--}
}
Yumwey
2021-03-29 17:07:05 +08:00
if ( reject )是啥东西...

你直接在 else 里写你的公共逻辑,或者在 parseResponse 给个 cb,在 else 中调用不就行了?

比如:
else {
cb && cb.call()
// 公共部分
reject()
}
Shook
2021-03-29 17:07:17 +08:00
--const response = await http(config);
--const { data: { error, message } } = response;
wgbx
2021-03-29 17:15:24 +08:00
1 楼说的差不多了,promise 你真的需要重新看一遍,promise 异步调用的面试题还挺多的
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();
}
}
);
}
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`。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/766208

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX