Node.js 如果api不';不回答

Node.js 如果api不';不回答,node.js,rest,settimeout,Node.js,Rest,Settimeout,我看到如果一个请求没有响应,它会等待超过60秒。 在我的例子中,我有嵌套的异步循环,通过回调和承诺进行管理。每个元素都是一个api调用。 所以我想检测,比如说,一个api在10秒后是否没有响应 我的api请求代码: return new Promise((resolve, reject) => { var start = moment(); const req = adapterFor(url).request(options, (resp) =>

我看到如果一个请求没有响应,它会等待超过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调用完成时始终得到解决。无论先发生什么,都会得到解决


如果您可以使用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调用完成时始终得到解决。无论先发生什么,都会得到解决


一个选项是在配置的时间之后指示要拒绝的标志。在下面的示例中,您可以看到变量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();
});

一个选项是在配置的时间之后指示要拒绝的标志。在下面的示例中,您可以看到变量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();
});

在这种情况下,是否要断开(url)的
适配器。请求
10秒后请求?如果请求时间超过10秒,则类似于拒绝()。在这种情况下,是否要断开(url)的
适配器。请求
10秒后请求?类似于拒绝()如果请求需要10秒以上,很好,但我无法将其应用到我的案例中。很好,但我无法将其应用到我的案例中。这就是我最初的想法,似乎是最好的解决方案。这就是我最初的想法,似乎是最好的解决方案