#javascript #synchronization #sails.js #instagram-api
#javascript #синхронизация #sails.js #instagram-api
Вопрос:
Я пытаюсь написать функцию, которая получает всех пользователей, которым понравились ваши фотографии с Sails.js использую instagram-node, но у меня возникли некоторые проблемы с синхронизацией.
Я пробовал это, но это не работает, потому что обратный вызов вызывается перед getLikes() . Есть идеи?
function getAllMediaIDs(function() {
// Send results
});
function getAllMediaIDs(callback) {
ig.user_self_media_recent(options, function(err, medias, pagination, remaining, limit) {
if (err) {
// Error
}
else {
for (var i = 0; i < medias.length; i ) {
getLikes(medias[i].id);
}
callback();
}
});
}
function getLikes(mediaId) {
ig.likes(mediaId, function(err, result, remaining, limit) {
if (err) {
// Error
}
else {
for (var i = 0; i < result.length; i ) {
// Store likes
}
}
});
}
Ответ №1:
В асинхронной операции используйте асинхронный цикл. Итак, вместо for()
использования цикла async.each()
или async.eachSeries()
из асинхронной библиотеки
Документ: каждый () / eachSeries()
const async = require('async');
getAllMediaIDs()
.then(function(data) {
// ur logic
})
.catch(function(err) {
// handle error
});
function getAllMediaIDs() {
return new Promise(function(resolve, reject) {
ig.user_self_media_recent(options, function(err, medias, pagination, remaining, limit) {
if (err) return reject(err); //return Error
async.eachSeries(medias, function(key, next) {
getLikes(key.id)
.then(function(data) {
next(); // go to next key
})
.catch(function(err) {
return reject(err); // something went wrong so return error
});
}, function(err, data) { // <-- called when all iteratee functions have finished or error occurs
if (err) return reject(err);
return resolve(); // everything was good
});
});
});
}
function getLikes(mediaId) {
return new Promise(function(resolve, reject) {
ig.likes(mediaId, function(err, result, remaining, limit) {
if (err) return reject(err); // return error
async.each(result, function(key, next) {
// some store logic
// eg. arr.push(key);
next(); // go to next key
}, function(err, data) {
if (err) return reject(err); // return error
return resolve(); // everything was good
});
});
});
}
Комментарии:
1. Спасибо! Не отсутствует ли обратный вызов() в функции getAllMediaIDs?
2. @LorenzoR Правильно. Исправлено!