2016-09-05 2 views
1

У меня есть два компонента, и мне нужно показать одни и те же данные в обоих компонентах. Моей служба:Общие сведения об услугах с обещаниями

export default class Logs {  

    constructor($http, $q, httpService) { 
     this.$http = $http; 
     this.$q = $q; 
     this.$rootScope = $rootScope; 
     this.httpService = httpService; 
     this.logs = null; 
     this.getDefer = this.$q.defer(); 
     this.loadData(); 
    } 

    loadData() { 
     var request = {url: '/logs'}; 
     this.httpService.getJson(request) 
      .then((response) => { 
       this.logs = response.data; 
       this.getDefer.resolve(this.logs); 
      }) 
      .catch((err) => { 
       this.getDefer.reject(err); 
      }); 

     return this.getDefer.promise; 
    } 

    getLogs() { 
     return this.getDefer.promise; 
    } 

    create(newLog) { 
     return this.$http.post('http://localhost:9000/api/logs', newLog); 
    } 
} 

// this is example of using service in component 
this.logService.getLogs().then((result) => {     
    this.logs = result;    
}); 

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

ответ

1

Вы делаете это немного неправильно. Вы должны вернуть обещание от getLogs.

Как:

getLogs() { 

    if(this.getDefer) return this.getDefer.promise; 
    this.getDefer = $q.defer(); 
    loadData().then(function(data){ 
     this.getDefer.resolve(data); 
     delete this.getDefer; 
    }); 
    return this.getDefer.promise; 

} 

и LoadData:

loadData() { 
    if(this.logs) return $q.when(this.logs); //<-- return cached if exist 
    var request = {url: '/logs'}; 
    return this.httpService.getJson(request) 
     .then((response) => { 
      this.logs = response.data; 
      return response.data; 
     }); 
} 

Так LoadData это частный метод, который асинхронном возвращать данные, и, возможно, кэширует его, и getLogs должны быть отправной точкой для получения этой информации. Поэтому вы должны использовать defer в getLogs. Если уже есть запрос на loadData - возврат обещания, else - создать новый отложенный.

К сожалению, я не могу предоставить Plunker прямо сейчас, но это концепция. :)

+0

Спасибо, это то, что мне нужно – user348173

+0

Добро пожаловать :) – Kindzoku

Смежные вопросы