@MalyshevDmitry

Как реализовать Сhaining в Javascript с особыми требованиями?

Добрый вечер.

Есть идея реализации chaining вызовов в javascript таким образом:
Users([24, 9, 1, 52]).getProfiles(function(error, result){

    if (....) Users([9]).setBlock(600);

});


Всё бы ничего - можно посмотреть реализацию такого же подхода в jQuery (например, $('....').animate() ).
Но в моем случае мне нужны следующие возможности.

1. Когда выполняется первая часть:
Users([24, 9, 1, 52])...
То, сначала в какую-то глобальную (или не глобальную) переменную внутри Users должен записаться такой список [24, 9, 1, 52] (предположим это будет выглядеть так: var list = [24, 9, 1, 52];)

2. При выполнении метода getProfiles() требуется какая-то служебная информация к вышеобозначенному списку. В таком случае эта глобальная переменная дополняется какими-нибудь служебными данными и может это уже выглядеть так:
var list = [
{id: 24, shard: 2}, 
{id: 9, shard: 1}, 
{id: 1, shard: 1}, 
{id: 52, shard: 4}
];


3. Соответственно, когда выполняется
Users([9]).setBlock(600);

Метод setBlock() уже будет обладать служебной информацией ({id: 9, shard: 1})

Вопрос, как реализовать "кеширование" вот такой служебной информации в рамках Users?
  • Вопрос задан
  • 2205 просмотров
Пригласить эксперта
Ответы на вопрос 1
@friday
В этом случае Users лучше сделать конструктором и вызывать его, соответственно, с new, тогда getProfiles и setBlock будут методами и будут обращаться к свойству инстанса. А list лучше сделать не массивом, а объектом, так поиск по id будет работать быстрее.
Например, так:

var Users;
(function(){
  var usersList = {};
  Users = function (ids) {
    this.ids = ids;
  };
  Users.prototype.getProfiles = function () {
    this.ids.forEach(function (id) {
      if (!usersList[id]) {
        usersList[id] = getProfile(id);
      }
    });
  };
  Users.serBlock = function (...) {
    var users = this.ids.reduce(function (memo, val) {return usersList[val];}, {});
    ...
  };
})();
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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