Опрос URL синхронно - PullRequest
       16

Опрос URL синхронно

1 голос
/ 20 июня 2019

Я ищу функцию, которая опрашивает определенный URL-адрес синхронно (то есть отправляет один запрос, подождите, пока он вернется, прежде чем отправлять другой). Однако я не уверен, почему это не работает.

const request = require('request')

let count = 0;

function test() {
    setInterval(() => {
        console.log(count)
        request({uri: "https://google.com"}, (err, resp, body) => {
            console.log(count)
            count++;
        })
      }, 100);
}

Я бы подождал, пока он напечатает count в последовательном порядке (1 2 3 4 5 ...), но в настоящее время он печатает одни и те же числа несколько раз, указывая, что это не то поведение, которое я намеревался.

Как мне заставить его ждать обратного вызова, прежде чем делать еще один интервал?

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Что вы делаете, это отправляете запрос каждые 100 миллисекунд, ничто в вашем коде не ожидает ответа.Для этого вы хотите удалить setInterval и просто снова вызвать функцию в обратном вызове.

const request = require('request')

let count = 0;

function test() {
    console.log(count)
    request({uri: "https://google.com"}, (err, resp, body) => {
        console.log(count)
        count++;
        test();
    })
}
0 голосов
/ 20 июня 2019

setInterval не подходит для обещаний, потому что он вызывает обратный вызов несколько раз, в то время как обещание разрешается один раз.

Вы можете попробовать это

var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

test = async ()=> {
  while (true) {
    await request({ uri: "https://google.com" }, (err, resp, body) => {
        count++;   
    })
    await wait(1000);
    if(count == 100)
        break;
    console.log(count)
 }
}
test();
...