Подтвердить что ты не робот

NodeJS - создание синхронного цикла while

У меня есть следующий фрагмент кода

var page = 2;
var last_page = 100;
while(page <= last_page) {
  request("http://some_json_server.com/data?page=" + page, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      store_data(body)
    }
    page++;
  });                
}

Я сделал следующее, но на самом деле ничего не извлекал. Правильно ли я делаю это?

var page = 2;
var last_page = 100;
while(page <= last_page) {
var async_arr = [];
async_arr.push(
  function(next) {
    request("http://some_api_url?page=" + page, function (error, response, body) {
      if (!error && response.statusCode == 200) {
        store_data(body);
      }
    });
  }
);

async.series(
  async_arr, done
);
4b9b3361

Ответ 1

Вы ищете async.whilst(). Это решение предполагает, что вы действительно хотите выполнять каждый запрос за другим. Как упоминает @UpTheCreek (редактирование: комментарий, о котором я говорил, был отредактирован), скорее всего, можно будет сделать это асинхронно и отслеживать каждый результат с помощью async.parallel.

var page = 2,
    lastPage = 100;

async.whilst(function () {
  return page <= lastPage;
},
function (next) {
  request("http://some_json_server.com/data?page=" + page, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      store_data(body)
    }
    page++;
    next();
  });
},
function (err) {
  // All things are done!
});

Ответ 2

С while вы получаете цикл занятости, который является контрцелированным в Node.

Вместо этого сделайте рекурсивную функцию. Каждый вызов будет выполнен отдельным тиком.

var page = 2;
var last_page = 100;

(function loop() {
    if (page <= last_page) {
        request("/data?page=" + page, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                store_data(body)
            }
            page++;
            loop();
        });
    }
}());