我有一个辅助功能:
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()
仍然很薄答案 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/