instagram — проблема с синхронизацией узлов

#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 Правильно. Исправлено!