javascript - 在之前的 $http 完成后使用 $http

标签 javascript ajax angularjs

我有 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/

相关文章:

javascript - 如何在用户移动到下一个选项卡之前显示确认模式?

javascript - 预检响应具有无效的 HTTP 状态代码 405

javascript - 如何使用 $.getJSON 的结果?

javascript - 身份验证 header 无法正常工作 ajax 401 未经授权

javascript - 访问 ng-grid 中的选择元素

angularjs - 如何将 jsonp 与 Angular-ui 日历一起使用

javascript - 功能事件超时不起作用

javascript - tinyMCE 编码 HTML 标签

ajax - JSP:当通过 Ajax POST 调用 servlet 时,RequestDispatcher.forward() 不转发

javascript - 使用 RxJS Observables 的 Promise.all 行为?