2015-05-14 3 views
0

У меня есть ситуация, когда я создаю слой данных на основе ES6 JS Promises, которые извлекают данные из сети. Я кэширую все обещания внутренне по URL.ES6 Promise автоматическая пост-обработка/клонирование результатов

Все, кажется, работает нормально, кроме одного. Я хочу, чтобы данные, выходящие из сетевого уровня, были копией/клоном данных, полученных из сети, и я, очевидно, не хочу делать это везде в клиентском коде, который реализует обработчики Promise.

Я хотел бы установить это, чтобы обработчик автоматически получал копию кэшированных данных.

Чтобы добавить к этому поворот, я хотел бы, чтобы это было настроено на основе URL-адреса внутри слоя данных, так что некоторые обещания делают дополнительную копию после обработки, а другие возвращают только исходный результат.

Может ли кто-нибудь предложить правильную реализацию для этого? Я должен упомянуть, что я хотел бы получить новую копию исходного исходного результата каждый раз, когда новый клиент попросит об этом.

В настоящее время упрощенной реализации псевдо выглядит следующим образом

getCachedData(url){ 
    if (cache[url]) { 
    return cache[url]; 
    } else { 
    var promise = new Promise(function(resolve,reject){ 
      var data = ...ajax get...; 
      resolve(data); 
    }); 
    cache[url] = promise; 
} 

getCachedData(url).then(result=>{ 
    here I want the result to be a copy of data I resolved the original promise with. 
}); 
+0

Просто используйте 'get (url) .then (clone)'? Какова ваша текущая реализация? – Bergi

+0

опубликовал псевдокод текущей реализации. – Moonwalker

ответ

1

структурировать следующим образом:

function retrieveCopiedData() { 
    // getDataFromServer is your original Promise 
    return getDataFromServer().then(function (value) { 
     // use a library of your choice for copying the object. 
     return copy(value); 
    })} 
} 

Это означает, что все потребители retrieveCopiedData получит возвращаемое значение из then() обработчика retrieveCopiedData «s.

retrieveCopiedData().then(function (value) { 
    // value is the copy returned from retrieveCopiedData's then handler 
}) 

Вы можете добавить условную логику retrieveCopiedData, как вы считаете нужным.

1

Похоже, вы просто хотите, чтобы включить процесс клонирования прямо в слое данных:

getCachedData(url){ 
    if (!cache[url]) { 
     cache[url] = new Promise(function(resolve,reject){ 
      var data = ...ajax get...; 
      resolve(data); 
     }); 
    } 
    if (requiresPostProcessing(url)) 
     return cache[url].then(clone); 
    else 
     return cache[url]; 
} 

Обратите внимание, что это может быть хорошей идеей, чтобы не клонировать данные каждый раз, когда он извлекается, а просто freeze объект, с которым разрешено ваше обещание.

+0

Bergi - не знал про замораживание, так спасибо за реф. Я думаю, что мне нужна копия, поскольку идея состоит в том, чтобы разрешить модификации объектов в клиентском коде, гарантируя, что исходный объект остается неповрежденным в кеше. Когда я пишу измененные объекты обратно в сеть, я аннулирую соответствующую кэшированную запись (на каждый URL). – Moonwalker

+0

Вы хотите использовать неизменяемые структуры данных :-) Обещания - это неизменный результат, поэтому замораживание объекта просто согласовано. В функциональном prgroamming никакая функция не должна вносить никаких изменений в свои аргументы, а вместо этого создавать новые объекты. Замораживание просто заставляет ваш клиентский код использовать 'clone', когда он ему нужен (я буду предполагать, что модификация редко встречается). – Bergi