2014-09-06 119 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的第二个问题的答案。