2016-07-03 6 views
2

Я пишу Угловое приложение. Мне нужен метод getData(), чтобы всегда возвращать обещание. Поэтому, если данные извлекаются из локального хранилища и не являются нулевыми, они должны быть возвращены как обещание без вызова $ http.get part.Как вернуть обещание?

Как его написать?

getData() { 
     var data = localStoradge.getItem('data'); 
     if (data == null) { 
     return $http.get('url').then(function(response){ 
      data = response; 
      return data 
      }) 
     } 
    } 

ответ

1

$ q.when() делает th e трюк angular $q API doc. Также полезно: $http API doc.

function getData() { 

    var data = localStoradge.getItem('data'); 
    if (!data) { 
    // assigning the promise returned by $http.get to the data variable 
    data = $http.get('url').then(function(response) { 
     // setting the data to local storage so it will be fetched from there the next time 
     // the response body of a $http response is in response.data 
     // see $http API doc linked above.. 
     localStoradge.setItem('data', response.data); 
     // returning this will make the promise resolve to the the content of the resource found at 'url' 
     return response.data; 
    }); 
    } 
    // $q.when always returns a promise. 
    // If data was found in the local storage that data will be wrapped in a promise which will resolve automatically right away. 
    // If the local storage was not there the data variable will be the promise we get from $http and $q.when will return that promise. 
    // In both cases your getData method returns a promise which resolves to your data 
    return $q.when(data); 
} 
+0

Лучший матч, спасибо! :) – boooni

6

Просто вернуть уже разрешенное обещание, если данные уже доступны (с использованием синтаксиса ES6):

function getData() { 
    var data = localStorage.getItem('data'); 
    if (data == null) { 
     return $http.get('url'); 
    } else { 
     // return promise that is already resolved 
     return Promise.resolve(data); 
    } 
} 

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

Примечание: поскольку все, что вы делали в своем обработчике .then(), просто возвращало данные, вы можете полностью удалить его.


Или, используя угловую синтаксис $ Q, он будет выглядеть следующим образом:

function getData() { 
    var data = localStorage.getItem('data'); 
    if (data == null) { 
     return $http.get('url'); 
    } else { 
     // return promise that is already resolved 
     return $q.resolve(data); 
    } 
} 
0

Убедитесь впрыснуть $q

function getData() { 
    var data = localStoradge.getItem('data'); 
    if (data == null) { 
     return $http.get('url') 
    } else { 
     return $q.resolve(data) 
    } 
} 
+0

Это не решит проблему OP, поскольку это ничего не возвращает, если данные уже доступны в localStorage. – jfriend00

0

Используйте $ Q для обработки обетования Угловая:

function getData() { 
    let data = localStorage.getItem('data'); 
    let deferred = this.$q.defer(); 
    this.$http 
      .get(data) 
      .success(deferred.resolve) 
      .error(deferred.reject); 
    return deferred.promise; 
} 
+0

Эта функция 'getData()' не делает даже близко к той же функции, что и функция OP. – jfriend00

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