I am trying to write a function that gets all the user that has liked your pictures with Sails.js using instagram-node but I'm having some synchronization problems.
I tried this but it's not working because the callback is called before the getLikes(). Any ideas?
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
}
}
});
}
In asynchronous operation use asynchronous loop. So, instead for()
loop use async.each()
or async.eachSeries()
from async lib
Doc: each() / 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
});
});
});
}