我有 3 个 JSON Web 服务,我应该在我的应用程序中使用它们,
我使用 $http
从 URL 加载,我的代码是:
$http.get('http://{url}/users')
.then(function (result) {
storeUsers(result);
});
$http.get('http://{url}/news')
.then(function (result) {
storeNews(result);
});
$http.get('http://{url}/pages')
.then(function (result) {
storePages(result);
});
var users = getUsers();
问题:
1-所有$http
一起运行,而不是等到上一个$http
完成。
2- var users = getUsers();
将在 $http
完成之前运行。
更新: 我将代码更改为:
var loadedService = {
users: false,
news: false,
pages: false
};
function getUsers() {
deferred = $q.defer();
$http.get('http://{url}/users')
.then(function (result) {
loadedService.users = result;
deferred.resolve('I got users');
console.log("Get users");
});
return deferred.promise;
}
function getNews() {
deferred = $q.defer();
$http.get('http://{url}/news')
.then(function (result) {
loadedService.news = result;
deferred.resolve('I got news');
console.log("Get news");
});
return deferred.promise;
}
function getPages() {
deferred = $q.defer();
$http.get('http://{url}/pages')
.then(function (result) {
loadedService.pages = result;
deferred.resolve('I got pages');
console.log("Get pages");
});
return deferred.promise;
}
getNews().then(getUsers()).then(getPages()).then(function () {
console.log('Done !');
});
当我运行我的程序时,我会看到:
XHR finished loading: GET "http://{url}/pages". ionic.bundle.js:16185
Get pages sync.js:133
XHR finished loading: GET "http://{url}/users". ionic.bundle.js:16185
Get users sync.js:56
XHR finished loading: GET "http://{url}/news". ionic.bundle.js:16185
Get news sync.js:107
如您所见,首先加载pages
服务,然后加载users
服务,然后加载news
,而在我的代码中我说getNews().then(getUsers()).then(getPages())
.
最后 console.log('Done !');
不显示!
最佳答案
您可以使用 MajoB 或 Muhammad 建议的方法之一,或者您可以使用 3 个返回 Promise 的函数并按照您想要的顺序链接它们。
function getUsers(){
deferred = $q.defer()
$http.get('http://{url}/users')
.success(function (result) {
storeUsers(result);
deferred.resolve('I got users')
}).error(function(data, status, headers, config) {
// called if an error occurs
console.log('error');
deferred.reject(status)
});
return deferred.promise
}
function getNews(){
deferred = $q.defer()
$http.get('http://{url}/news')
.success(function (result) {
storeUsers(result);
deferred.resolve('I got news')
}).error(function(data, status, headers, config) {
// called if an error occurs
console.log('error');
deferred.reject(status)
});
return deferred.promise
}
function getPages(){
deferred = $q.defer()
$http.get('http://{url}/pages')
.success(function (result) {
storePages(result);
deferred.resolve('I got pages')
}).error(function(data, status, headers, config) {
// called if an error occurs
console.log('error');
deferred.reject(status)
});;
return deferred.promise
}
例如,假设您想在获取新闻后获取页面:
getNews().then(getPages())
最好拒绝错误情况下的 promise 并在链接上进行错误处理:
getNews().then(function() {
console.log('Success');
getPages();
}, function() {
console.log('Failed');
}, function() {
console.log('Executing... ');
});
当然,该链还返回一个您可以处理的 promise 。
关于javascript - 在之前的 $http 完成后使用 $http,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27100486/