Search code examples
javascriptsynchronizationsails.jsinstagram-api

instagram-node synchronization issue


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    
                }

            }

        });

    }

Solution

  • 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
                });
            });
        });
    
    }