Задать вопрос
@Topsky

Node.js что мне нужно, синхронность или асинхронность?

Приветствую, мне нужно сделать неизвестное кол-во запросов на сервер, до тех пор пока в ответе не будет json-ключа.
request({url:url}, function(err, response, body){
		let data = JSON.parse(body);
		while(data.nextPageToken !== undefined){
			var newUrl = url + '&pageToken=' + data.nextPageToken;
			request({url: newUrl}, function(err, response, body){
				newUrl = url + '&pageToken=' + JSON.parse(body).nextPageToken;
			})
		}
	})


Отправляется первый запрос, получаю nextPageToken, и повторно выполняю запрос, уже с новым полученным pageToken, и так до тех пор пока nextPageToken перестанет возращаться.
Кол-во итераций - неизвестно, ранее код был таким for(var i = 0; i < data.pageInfo.totalResults / maxResults; i++), поэтому и подумал про while, но запросы все выполняются мгновенно, и собственно запрос отправляется на 2-ой запрос.

Так что мне нужно, асинхронность, или синхронность я вот чего не пойму, как бы реализовать адекватно данную задачу?

--UPDATE
Проще и понятнее, нужно выполнить неизвестное кол-во запросов.
Каждый новый запрос будет состоять из части предыдущего запроса, конечное число итераций определяется отсутствием искомого ключа в ответе.

Просто while начинает отправлять кучу сотен запросов на сервер, которые еще не сформированы из ответа.
  • Вопрос задан
  • 2289 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
node v7.6+ или транспайлим бабелем async2generators
function requestAsync(params) {
  return new Promise((resolve, reject) => {
    request(params, (err, response, body) => {
      if(err) { return reject(err); }
      resolve({response, body});
    });
  });
}

async function getURL(_url) {
  var data, url = _url;
  do {
    const {body} = await requestAsync({url});
    data = JSON.parse(body);
    url = _url + '&pageToken=' + data.nextPageToken;
  } while(data.nextPageToken !== undefined);
  return data;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Topsky Автор вопроса
Есть решение, вот такое
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!
});


Но подключается сторонний пакет Async, и хотелось бы без нее как-то обойтись.
Вроде в javascript были async, await, но не особо получается их использовать
await request({}, function(){})
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы