0

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

Хотел бы, чтобы в коде какой-либо разработчик мог не париться и просто вызывать метод.

let data = customService.getData(id);

Для этого в сервисе customService мне нужно делать примерно следующее:

let localObj = {};

function getData(id) {
  return localObj.id === id
    ? localObj.data
    : getDataFromServer(id);
}

function getDataFromServer(id) {
  return http.get(url)
    .then(onSuccess);

  function onSuccess(data) {
    localObj.id = id;
    localObj.data = data;

    return data; <---- вот это я хочу вернуть, но возвращается Promise.
}

И возникает проблема. При первом обращении к методу

let data = customService.getData(id);

в data находится объект Promise, а не данные.

Подскажите, пожалуйста, как научить фунцию возвращать данные из промиса без async/await.

ДОПОЛНЕНИЕ

Вопрос помечен как дубликат. Видимо, я не правильно донес свою мысль. Меня интересует, можно ли написать метод в сервисе так, чтобы вызывать его из контроллера можно было без .then ?

Понятно, что я могу сделать так:

customService.getData(id).then(newData => data = newData);

Но хотелось бы все колбэки оставить внутри сервиса, если это возможно.

  • 1
    Напрямую развернуть результат нельзя. Можно было бы попробовать использовать async/await, но сама функция при этом тоже будет возвращать promise, и если эта функция controller то все вообще может сломаться. – Grundy May 15 '18 at 09:40
  • 1
    Даже если бы было можно - ни в коем случае не нужно. На время выполнения скрипта страница блокируется, и если скрипт будет ожидать ответа от сервера перед продолжением выполнения, то пользователь в это время не сможет пользоваться зависшим сайтом. А если интернет лаганёт и ответ сервера не придёт, то браузер просто убьёт ваш скрипт как зависший. Промисы и async/await ничего не блокируют - используйте их. – andreymal May 15 '18 at 09:55
  • 1
    Можно, если вы не планируете никак пользоваться возвращаемым значением. Если планируете, то вам нужно назначить какой-то код, который его получит (потому что в области видимости вызывающего его нет и не будет), коллбэком или вариациями вроде async/await. Дубликатный вопрос с виду соответствует спрашиваемому. –  May 15 '18 at 10:12
  • нет, такой метод написать нельзя. ты можешь написать метод, который возвращает тебе объект, а при резолве промиса копировать данные в этот объект, но я сомневаюсь, что тебе нужно именно это – nörbörnën May 15 '18 at 11:23

0 Answers0