javascript - 如何仅在 Angular 中发出 $http 请求后才运行 javascript 函数?

标签 javascript angularjs http

我正在开发一个 Angular.js 应用程序,它会调用 GitHub API。首先,调用以检索用户的所有存储库。然后对于每个 repo,调用以检索 README。我有一个 javascript 函数,我希望它只在所有 README API 调用完成后运行。

这是我的 Controller :

readmeSearch.controller('ReadMeSearchController', ['RepoSearch', 'ReadMeSearch', function(RepoSearch, ReadMeSearch) {

  var self = this;
  self.gitRepoNames = [];
  self.readMes = [];
  self.noReadMes = [];

  self.doSearch = function() {
    RepoSearch.query(self.username)
      .then(function(repoResponse) {
        addRepoNames(repoResponse);
        for(var i = 0; i< self.gitRepoNames.length; i++) {
          (function(i) {
            ReadMeSearch.query(self.username, self.gitRepoNames[i])
              .then(function(readMeResponse) {
                addToReposWithReadMes(readMeResponse, i);
              }).catch(function(e){
                addToReposWithoutReadMes(repoResponse, i);
              });
          })(i);
        };
      });
  };

  addRepoNames = function(response) {
    self.searchResult = response.data;
    for(var i = 0; i < self.searchResult.length; i++) {
      var name = self.searchResult[i]['name']
      self.gitRepoNames.push(name);
    };
  };

  addToReposWithReadMes = function(response, i) {
    self.readMes.push(
      {
        name: self.gitRepoNames[i],
        size: parseInt(response.data["size"]),
        url: response.data["html_url"]
      }
    );
  };

  addToReposWithoutReadMes = function(response, i) {
    self.noReadMes.push(
      {
        name: self.gitRepoNames[i]
      }
    );
  };

  percentageOfReposWithReadMes = function() {
    var percentage;
    percentage = (self.noReadMes.length / self.gitRepoNames.length) * 100
    self.readMePercentage = percentage.toFixed(1);
  };

}]);

使用 ReadMeSearch 工厂的 README API 调用填充两个数组,一个用于带有 README 的 repos,一个用于没有 README 的 repos。我想仅在 self.gitRepoNames 中的所有存储库的 ReadMeSearch.query 完成后才运行函数 percentageOfReposWithReadMes

我试过在 RepoSearch.query 之后使用 .then 但这似乎不起作用。我认为我对 Angular promises 和 .then 函数的理解有点困惑。任何帮助将不胜感激。

最佳答案

返回你的 promise 并从这些 promise 中

 self.doSearch = function() {
    var namesPromise = 
        RepoSearch.query(self.username)
            .then(function(repoResponse) {
                 addRepoNames(repoResponse);
                 //return promises for chaining
                 return lookupNamesPromises(repoResponse);
            }) .catch (function (error) {
                 //log error
            });
    //chain from promise
    namesPromise.then (function(promises) {
        $q.all(promises).finally( function() {
            percentageOfReposWithReadMes();
        })
    });
    //return promise for chaining elsewhere
    return namesPromise;
  };

查找函数返回一个 promise 数组。

  self.lookupNamesPromises = function (repoResponse) {
    var namesPromises = [];
    for(var i = 0; i< self.gitRepoNames.length; i++) {
          //begin IIFE closure
          (function(i) {
              var p = (ReadMeSearch.query(self.username, self.gitRepoNames[i])
                       .then(function(readMeResponse) {
                           addToReposWithReadMes(readMeResponse, i);
                           return readMeResponse;
                       }).catch(function(e){
                           addToReposWithoutReadMes(e, i);
                           return e;
                       })
              );
              namesPromises.push(p);
          })(i);
          //end IIFE closure
    }
           //return promises for chaining
    return namesPromises;
  };

通过链接您的 promise ,后续功能将等待先前功能完成。函数式编程的经验法则是总是返回一些东西

关于javascript - 如何仅在 Angular 中发出 $http 请求后才运行 javascript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33954211/

相关文章:

javascript - 如何使用 javascript 构造函数创建一个 html 元素?

javascript - 如何委托(delegate)这个功能

javascript - 在 AngularJS 中注入(inject)原始类型

javascript - AngularJS 和 UI 路由器 : 'Error: transition superseded' during angularjs unit tests

javascript - AngularJs查看用户详细信息

json - 用于强制执行限制的 "Origin"http header 的兼容性

JavaScript RegExp 对象

javascript - Angular 翻译即时方法不起作用

http - URI 是否包含协议(protocol)?

使用 SSL 时不再存储 PHP session