V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

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

  •  
  •   Newyorkcity · 2021-03-29 16:35:58 +08:00 · 1358 次点击
    这是一个创建于 1340 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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) 的方法不行。不知道可行的方法是怎么样的。谢谢。

    8 条回复    2021-03-30 10:51:39 +08:00
    kurisu1901
        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)
    }
    }
    );
    }
    ```
    codder
        2
    codder  
       2021-03-29 17:03:41 +08:00
    .catch 是一定要有的,嫌麻烦可以将错误输出封装成函数,如果是 axios 获取一部请求可以在配置里拦截错误,这样正常写的时候就不用捕获错误就不用写 catch 了
    Shook
        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;
    --}
    }
    Yumwey
        4
    Yumwey  
       2021-03-29 17:07:05 +08:00
    if ( reject )是啥东西...

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

    比如:
    else {
    cb && cb.call()
    // 公共部分
    reject()
    }
    Shook
        5
    Shook  
       2021-03-29 17:07:17 +08:00
    --const response = await http(config);
    --const { data: { error, message } } = response;
    wgbx
        6
    wgbx  
       2021-03-29 17:15:24 +08:00
    1 楼说的差不多了,promise 你真的需要重新看一遍,promise 异步调用的面试题还挺多的
    cydysm
        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();
    }
    }
    );
    }
    cyrbuzz
        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`。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3140 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:35 · PVG 22:35 · LAX 06:35 · JFK 09:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.