向catch处理程序抛出错误,然后忽略函数?

时间:2018-11-16 12:49:28

标签: javascript promise try-catch

我有一个辅助功能:

function httpRequestHelper(body) {
    return fetch(`${host}:${port}`, {
        method: 'post',
        body: JSON.stringify(body)
    })
    .then(function (response) {
        if (!response.ok) {
            throw Error(response.statusText);
        }
        return response.json();
    })
    .then(function(response) {
        if (response.type === 'error') {
            throw Error(response);
        }
        return response;
    })
    .catch(function(error) {
        return error;
    });    
}
我写的

是为了使各种命令的功能简短。这些函数只是指定要发送的正文以及响应的哪一部分与消费者有关:

function hasActiveProject() {
    return httpRequestHelper({ type: 'request', cmd: 'has_active_project' })
    .then(function (response) {
        return response.payload.value;
    })
}

我执行如下各种命令:

try {
    let hasActiveProjectResponse = await otii.hasActiveProject()
    console.log(hasActiveProjectResponse);    
} catch (error) {
    console.log(error);
}

现在的问题是,在catch函数中,我希望抛出错误消息,但是我却收到类似以下的错误消息:

TypeError: Cannot read property 'value' of undefined

这是因为hasActiveProject()试图即使在出现错误时也提取相关的响应,并导致将不同的错误返回给我的catch(错误)处理程序。

我该如何重写

  • hasActiveProject()仍然很薄
  • 捕获处理程序收到原始错误

1 个答案:

答案 0 :(得分:1)

确定要输入错误吗? response.payload是不是未定义?因为在此测试小提琴中,您可以看到它可以按您希望的方式工作,因此try捕获了.then函数内部抛出的错误,并且不会继续。

https://jsfiddle.net/8qe1sxg4/6/

看来response.type是有效的,所以您没有抛出任何错误,可以确认得到的结果吗?

更新

经过更多研究后,catch函数不会冒泡到下一个catch,它认为您已经处理了错误并照常继续操作(使用catch中的已解析值)。 但是您只需在.catch()内部再次拒绝,这样您的错误就会冒泡到try / catch:

httpRequestHelper()中:

.catch(function(error) {
    return Promise.reject(error)
    //return error;
});

这会将您的错误发送到下一个陷阱,例如参见小提琴: https://jsfiddle.net/dcuo46qk/3/