2016-07-03 29 views
2

私は角度アプリを書いています。常にpromiseを返すにはgetData()メソッドが必要です。したがって、データがローカルストレージから取得され、nullでない場合、$ http.getの部分を呼び出さずにpromiseとして返す必要があります。約束を返すには?

どのように書きますか?データは(ES6の構文を使用して)すでに利用可能である場合

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

答えて

1

$ q.when() 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

だけですでに解決の約束を返す:

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

データがすでにlocalStorageで利用可能な場合、これは何も返しませんので、OPの問題はまったく解決されません。 – 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