【问题标题】:instagram-node synchronization issueInstagram 节点同步问题
【发布时间】:2016-10-11 01:57:12
【问题描述】:

我正在尝试编写一个函数,使用 instagram-node 获取所有喜欢 Sails.js 的图片的用户,但我遇到了一些同步问题。

我试过了,但它不起作用,因为回调是在 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    
                }

            }

        });

    }

【问题讨论】:

    标签: javascript synchronization sails.js instagram-api


    【解决方案1】:

    在异步操作中使用异步循环。所以,而不是 for() 循环使用 async.each()async.eachSeries() from async lib

    文档: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
                });
            });
        });
    
    }
    

    【讨论】:

    • 谢谢!函数 getAllMediaIDs 中不是缺少 callback() 吗?
    • @LorenzoR 对。固定!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2014-11-19
    • 2015-03-25
    • 2019-08-18
    相关资源
    最近更新 更多