2014-09-06 116 views
-1

我有兩個有關AngularJS承諾的問題:如何創建我自己的承諾?

  1. 我該如何創建自己的承諾?

請參見下面的代碼:

function controller($http) { 
    var dataCache; 

    function getData(){   

     if(dataCache != null){ 
      // should return my own promise here 
      // to pass the value of 'dataCache' to 'then' immediately 
     } else { 
      return $http.get('...some url ...'); 
     } 
    } 
} 
  1. 如何返回最後一個承諾?

代碼:

function controller($http) { 

    var urlArr = ['url1', 'url2', 'url3']; 

    function getDataOneByOne() { 
      // should call $http.get() for the url in the 'urlArr' one after another in a chain 
      // and return the last promise 
    } 
} 
+2

https://docs.angularjs.org/api/ng/service/$q – Ian 2014-09-06 01:37:16

+1

請在將來寫每個帖子一個問題。嘗試以對社區最有幫助的方式撰寫你的帖子(未來的觀衆)。 – m59 2014-09-06 01:56:13

回答

2

對於第二個問題,做urlArrArray.prototype.reduce,並建立承諾鏈:

function controller($http, $q) { 

    var urlArr = ['url1', 'url2', 'url3']; 

    function getDataOneByOne() { 
     return urlArr.reduce(function (chain, url) { 
      return chain.then(function() { 
       return $http.get(url); 
      }); 
     }, $q.when()); 
    } 
} 

不要忘了處理$ HTTP錯誤,雖然。

+0

不錯,你打敗了我,做了一個更好的工作。完整的promise庫對於這類事情有更好的解決方案,但這對於有限的Angular'$ q' api很有用。 – m59 2014-09-06 01:52:53

2

對於第一個問題,我相信你正在尋找$q.when()。它在承諾中包含一個正常值並解決它。

function getData(){   

    if(dataCache !== null) { 
    $q.when(dataCache);  
    } else { 
    return $http.get('...some url ...'); 
    } 

} 

getData.then(function() { 

}); 

請參閱Klaster的第二個問題的答案。