我正在开发一个 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/