我有一个关于超时的 promise race 实现。我想在超时的情况下记录超时错误。
问题是即使获取成功它也会记录,因为它并行运行并且在超时后仍然执行。
在哪里放置 errorLogger.info(message)
以便它不会在 non-timeout
情况下执行?我想我把它放错了,所以它在实际拒绝之前就输出了。
return Promise.race([
fetch(url, options)
.then(function (response) {
if (response.status >= 400) {
const message = `fetch-utility.js: bad server response while fetching url=${url} with options=${options}.`;
errorLogger.error(`${message} Response: status=${response.status} statusText:${response.statusText}.`);
throw new BadServerResponseException(message, response.status);
}
return response;
}),
new Promise((_, reject) =>
setTimeout(() => {
const message = `fetch-utility.js: timeout happened while fetching details url=${url} with options=${options}.
The timeout set is ${timeout}.`;
// TODO: this gets logged even the parallel wins - need to see better way to log this
// errorLogger.error(message);
reject(new TimeoutException(message));
}, timeout),
),
]);
最佳答案
你不应该记录这两个结构中的错误,因为它确实会一直被调用。
相反,您可以在 Promise.race
返回的 promise 上链接 then
和 catch
。因此,您可以使 race
的参数非常简洁,并将逻辑移至外部。
类似于:
return Promise.race([
fetch(url, options),
new Promise((_, reject) => setTimeout(() => reject("timeout"), timeout))
]).catch(function(error) {
if (error === "timeout") {
const message = "timeout happened";
errorLogger.error(message);
throw new TimeoutException(message);
} else {
const message = "fetch failed";
errorLogger.error(message);
throw new FetchException(message);
}
}).then(function (response) {
if (response.status >= 400) {
const message = "bad response";
errorLogger.error(message);
throw new BadServerResponseException(message, response.status);
}
return response; // Success within timeout!
});
关于javascript - Promise reject - 超时日志记录放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55255012/