Запретить ожидание более 10 секунд, если API не отвечает - PullRequest
0 голосов
/ 29 января 2019

Я видел, что если на запрос нет ответа, он ждет более 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();
    })

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Один из вариантов - указать флаг для отклонения по истечении заданного времени.В приведенном ниже примере вы можете видеть, что переменная reqHasFinished изменяется внутри обратного вызова запроса, поэтому, если она остается ложной, вы можете отклонить запрос:

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();
});
0 голосов
/ 29 января 2019

Если вы можете использовать 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

https://jsfiddle.net/yLv64zr5/

...