Вопрос не новый, но я не пойму как организовывать скрипт для нормальной работы. Проблема, конечно-же в асинхронных запросах.
Задача проста - спарсить данные с сайта(REST API);
Я представляю так(псевдо-псевдо-код):
// функция_получить_число_записей - уже должна выполнить запрос, чтобы получить число записей.
// Запрос асинхронный.
var cnt = функция_получить_число_записей();
for(каждая запись)
{
//функция_получить_запись - запрос данных с сайта. Запрос асинхронный.
var данные = функция_получить_данные(запись);
функция_обработать_данные(данные);
}
var request = require('request-json');
var Q = require('q');
var client = request.createClient(SITE_URL);
// Обертка для асинхнонной функции
// (https://strongloop.com/strongblog/promises-in-node-js-with-q-an-alternative-to-callbacks/)
function client_post(path, data, callback) {
var deferred = Q.defer();
client.post(path, data, function (err, res, body) {
if (err)
deferred.reject(err); // rejects the promise with `er` as the reason
else
deferred.resolve(body); // fulfills the promise with `data` as the value
});
return deferred.promise.nodeify(callback); // the promise is returned
}
//Отправляет запрос на сайт
function requestData(data)
{ client_post(SITE_PATH, data, function (err, res) {
return res;
});
}
//Создает JSON объект с параметрами запроса
function createDataStruct(pageNumber){ ... }
var data = createDataStruct(61, 1, 1);
var res = requestData(data);
Я подсмотрел на одном сайте как создать promise - версию асинхронной функции (client_post), но это же абсолютно ничего не дает, вместо использования callback' ка самой функции, мы используем коллбэк который передается как параметр. В общем не понимаю, скажите что посмотреть, почитать, какой подход использовать.
Спасибо!