Запрашиваю два API, возвращающих данные источника и хранилища данных. Заполняю ими БД моего приложения, сравнивая данные источника и хранимые, для последующего обновления:
var dataStoredLoad = function( dataListOffset ) {
eventEmitter.emit('dataStoredFetched');
}
var dataSourceLoad = function( dataListOffset ) {
eventEmitter.emit('dataSourceFetched');
}
var middlewareDataToUpdate = function ( dataStoredLoad , dataSourceLoad ) {
dataStoredLoad.forEach( function (dataStored, index) {
dataSourceLoad.forEach( function (dataStored, index) {
if ( dataStored.id == dataSource ) {
// key.value comparsion procedure and .pop() / .push()
}
}
}
}
Оба API работаю async, а сравнение нужно запускать лишь когда оба массива данных загружены в БД.
Неизвестно, какой API вернет значения первым.
Что тут можно сделать и как это красиво пишут другие?
UPD:
Внутри функций - запросы к API, выполненные в неблокирующем async потоке, а забор данных выполняется в серии обращений через API, т.е. решение с async.parallel, предложенное также ниже, всегда валится в "колбэк(?)" function(err, results) где results is equal to: { one: ' ', two: ' ' }
Видимо, я как-то должен вопрос переформулировать, но не понимаю, как именно.
UPD2:
var answerAPI = crunchbase.request(arg1) ;
не null, с момента запуска, а сразу какая-то '', в ожидании ответа сервера API. что запрокидывает нас дальше по этому водопаду асинхронных функций к функции результата, функция отрабатывается с пустыми значениями, а потом (в моем случае) в консоль валятся результаты запросов к API.
async.series({
one: function(callback) {
var answerAPIone = crunchbase.request(arg1);
callback(null, answerAPIone );
},
two: function(callback) {
var answerAPItwo = airtable.request(arg1);
callback(null, answerAPItwo);
}
},
function(err, results) {
console.log( 'ИТОГО: <', results.one, '><', results.two, '>' );
// ИТОГО: <><>
});
Все уперлось в правильное написание функции с колбеком и использование async по его прямому назначению. Остальные варианты - замечательно расширили горизонты. Всем спасибо.