Повторное использование Javascript для управления несколькими вызовами

Используя обещания jQuery, я делаю следующее, чтобы управлять ситуацией, когда у меня есть несколько экземпляров, в которых мне нужно вызывать внешний ресурс, но я не хочу вызывать один и тот же внешний ресурс более одного раза.

  1. Первоначальные вызовы REST дают мне объекты данных несколько со ссылками на дополнительную информацию (в примере свойство «отдел» дает ссылку на то, где я могу найти дополнительную информацию об отделе).

{ "somedata": "...", "department": "https://api.../departments/1000", }

  1. Уже глубоко в отдельных вызовах функций для каждого объекта данных я хочу координировать все вызовы одних и тех же ресурсов. Я не хочу получать название отдела для "отдела 1000" несколько раз.

  2. Я сохраняю обещания ИЛИ возвращенный результат в словаре и повторно использую их.

    а. Если это обещание, я возвращаю то же обещание, которое будет повторно использовано вызывающей стороной.

    б. Если это полученное значение, я разрешаю обещание асинхронно, используя тайм-аут.

Вот код:

var Departments = {};

function getDepartmentName(id){
   var dfd = new $.Deferred();
   var promise = dfd.promise();

   if (id in Departments){
        if (typeof Departments[id] == 'object'){
            return Departments[id];//reuse the promise
        }else{//department name is a string
            setTimeout(function(){ dfd.resolve(Departments[id]); }, 0);         
        }
   }

   else{
       Departments[id] = promise;//Set dictionary value to the promise
       var dPromise = FetchDepartment('https://api.../departments/'+id);
       $.when(dPromise).then(
           function(departmentName){
               Departments[id] = departmentName;//Re-set dictionary value to the fetched value
               dfd.resolve(departmentName);
           },
           function(err){
               delete Departments[id]; 
               dfd.reject('Call failed');
           }
       );   
   }
   return promise;

}

Кажется, это работает, но меня беспокоит, настолько ли хорош этот дизайн. У меня есть несколько вопросов.

  1. Есть ли какие-то обещания, которые я должен использовать вместо этого?
  2. Есть ли ситуации, когда что-то может произойти в неправильном порядке?
  3. Правильно ли повторно использовать такой экземпляр обещания? Несколько вызывающих абонентов вызывают .then одного и того же объекта обещания, и, похоже, он работает хорошо, но я не знаю, как jQuery связывает всех этих получателей, когда обещание выполнено.
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

I save promises OR a returned result in a dictionary and reuse them. If it is a fetched value, I resolve the promise asynchronous by using a timeout.

Не усложняй. Это ведет себя точно так же, как если бы вы просто сдержали обещание и только вернули его, вместо того, чтобы создавать новые обещания для вызовов после того, как начальное выполнено.

Также избегать отсрочек, когда вы уже имеете дело с обещаниями.

var Departments = {};

function getDepartmentName(id) {
    if (id in Departments){
        return Departments[id]; //reuse the promise
    } else {
       var promise = FetchDepartment('https://api.../departments/'+id).then(null, function(err){
            delete Departments[id]; // allow retries
            throw err;
        });   
        return Departments[id] = promise;
    }
}

Is it correct to reuse a promise instance like this, where multiple callers make a call to .then of the same promise object?

Да, это нормально. Их обратные вызовы будут запланированы в том же порядке, что и исходящие вызовы then.

Ага, понятно. Поскольку тогда обратный вызов будет вызван немедленно, в этом случае, если он был вызван после того, как обещание уже было разрешено мне не нужно сохранять значение для повторного использования, я могу просто последовательно сохранять обещание. Высоко оценен и очень хорошо объяснен. Спасибо!

Gil Roitto 25.07.2018 10:41

Другие вопросы по теме