Необходимо создать метод, возвращайщий данные с сервера и кэширующий их. Если происходит повторное обращение к методу, нужно отдавать кэшированные данные.
Хотел бы, чтобы в коде какой-либо разработчик мог не париться и просто вызывать метод.
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);
Но хотелось бы все колбэки оставить внутри сервиса, если это возможно.
async/await, но сама функция при этом тоже будет возвращатьpromise, и если эта функцияcontrollerто все вообще может сломаться. – Grundy May 15 '18 at 09:40