Задать вопрос

Кеширование запроса при вызове функции NodeJS

Приветствую, такой вопрос по NodeJS -
Есть функция -
function getUserData (id, callback) {
        vk.api('users.get',{
            'user_ids'  : id,
            'fields'    : 'photo_100'
        }, function(err, result) {
            if (err) callback(err);
            else {
                callback(null, result.response[0]);
            }
        });
}


И вот как бы запрос -
getUserData(id, function(err, result) {
fn(result[some_data]);
});

Но как-бы организовать чтобы запрос к АПИ слался лишь один раз и все вызывающие функции ожидали пока придет ответ от неё?
  • Вопрос задан
  • 2561 просмотр
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Deferred/Promise, реализаций данного шаблона очень много, но вот пример использования
var cache_ = {},
    Class = require('atma-class');

function getUserData(id, callback) {
    
    var dfr = cache_[id];
    if (dfr == null) {
        // делеаем запрос только с первым вызовом функции с этим id
        dfr = cache_[id] = new Class.Deferred();
        
        vk.api('users.get', {
            'user_ids': id,
            'fields': 'photo_100'
        }, function(err, result) {
            if (err)
                return dfr.fail(err);
    
            dfr.resolve(result.response[0]);
        });
    }
    
    // подписываемся на окончание загрузки, если же
    // загрузка уже завершилась(успешно или нет),
    // то callback вызывается сраюу
    dfr
        .done(function(response) {
            callback(null, response)
        })
        .fail(callback);

}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы