如果 api 没有响应,则阻止请求等待超过 10 秒
Prevent request to wait more than 10s if api doesn't respond
我看到如果一个请求没有响应,它会等待超过 60 秒。
在我的例子中,我有嵌套的异步循环,通过回调和承诺进行管理。每个元素都是一个 api 调用。
所以我想检测例如 api 是否在 10 秒后没有响应以继续。
我的 api 请求代码:
return new Promise((resolve, reject) => {
var start = moment();
const req = adapterFor(url).request(options, (resp) => {
//console.log(`El pr ${options.path}`);
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
try {
tmpData = JSON.parse(data.trim());
if(tmpData.length != 0 && tmpData.films.length > 0) {
data = tmpData.films.filter(v => {
return v.film_o.length > 0
})
resolve(data);
}else resolve({"Errore" : url,error:some error',error_type:'some error',duration: ((moment() - start) / 1000)+' s'});
}catch (e) {
resolve({"Errore" : url,'error':'HERE MAYBE',error_type:'?!',duration: ((moment() - start) / 1000)+' s'});
}
// console.log(colors.gray("EL: " + tmpData.DS.Scheduling.Events.length.length));
});
});
req.end();
})
如果您可以使用 ESnext,那么您可以使用 Promise.race()。考虑以下示例:
Promise.race([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 5000)),
new Promise((resolve, reject) => setTimeout(() => resolve(2), 10000))
]).then(res => console.log(res))
您可以在数组中提供多个承诺,Promise.race 将始终选择最快的并解决这个问题。因此,您可以将承诺作为一个元素,将如上所示的超时作为第二个元素。然后,此承诺将始终在超时后或您的 api 调用完成时解决。先解决后解决
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race
一个选项是在配置的时间后指示要拒绝的标志。在下面的示例中,您可以看到变量 reqHasFinished 在请求回调中发生了更改,因此如果它保持为 false,您可以拒绝请求:
return new Promise((resolve, reject) => {
let start = moment(),
reqHasFinished = false;
const req = adapterFor(url).request(options, (resp) => {
reqHasFinished = true;
let data = '';
// resp operations here
});
// if after 10 seconds the request has not finished, the promise is rejected.
setTimeout(() => {
if (!reqHasFinished) {
reject('Go ahead');
}
}, 10000)
req.end();
});
我看到如果一个请求没有响应,它会等待超过 60 秒。 在我的例子中,我有嵌套的异步循环,通过回调和承诺进行管理。每个元素都是一个 api 调用。 所以我想检测例如 api 是否在 10 秒后没有响应以继续。
我的 api 请求代码:
return new Promise((resolve, reject) => {
var start = moment();
const req = adapterFor(url).request(options, (resp) => {
//console.log(`El pr ${options.path}`);
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
try {
tmpData = JSON.parse(data.trim());
if(tmpData.length != 0 && tmpData.films.length > 0) {
data = tmpData.films.filter(v => {
return v.film_o.length > 0
})
resolve(data);
}else resolve({"Errore" : url,error:some error',error_type:'some error',duration: ((moment() - start) / 1000)+' s'});
}catch (e) {
resolve({"Errore" : url,'error':'HERE MAYBE',error_type:'?!',duration: ((moment() - start) / 1000)+' s'});
}
// console.log(colors.gray("EL: " + tmpData.DS.Scheduling.Events.length.length));
});
});
req.end();
})
如果您可以使用 ESnext,那么您可以使用 Promise.race()。考虑以下示例:
Promise.race([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 5000)),
new Promise((resolve, reject) => setTimeout(() => resolve(2), 10000))
]).then(res => console.log(res))
您可以在数组中提供多个承诺,Promise.race 将始终选择最快的并解决这个问题。因此,您可以将承诺作为一个元素,将如上所示的超时作为第二个元素。然后,此承诺将始终在超时后或您的 api 调用完成时解决。先解决后解决
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race
一个选项是在配置的时间后指示要拒绝的标志。在下面的示例中,您可以看到变量 reqHasFinished 在请求回调中发生了更改,因此如果它保持为 false,您可以拒绝请求:
return new Promise((resolve, reject) => {
let start = moment(),
reqHasFinished = false;
const req = adapterFor(url).request(options, (resp) => {
reqHasFinished = true;
let data = '';
// resp operations here
});
// if after 10 seconds the request has not finished, the promise is rejected.
setTimeout(() => {
if (!reqHasFinished) {
reject('Go ahead');
}
}, 10000)
req.end();
});