angularjs的http请求如何修改为同步的?

RT,默认angularjs中的http请求为异步的,请问如何同步请求呢?

阅读 63.8k
8 个回答

1.promise 2.异步请求成功后broadcast 3.如果希望数据加载完 才进入某个router 用resolve

用原生xmlhttprequest.
同步的代价就是,在发送请求到服务器返回数据这段时间,你的网页将一直卡着,不能进行任何操作。楼主要想清楚。

var xhr = createXhr(method);
xhr.open(method, url, true);

//https://github.com/angular/angular.js/blob/master/src/ng/httpBackend.js 
//第61行



var xhr = new XMLHttpRequest();
xhr.open("GET", "test.txt", true);
xhr.onload = function (e) {
  if (xhr.readyState === 4) {
    if (xhr.status === 200) {
      console.log(xhr.responseText);
    } else {
      console.error(xhr.statusText);
    }
  }
};
xhr.onerror = function (e) {
  console.error(xhr.statusText);
};
xhr.send(null);

使用Angular时无法将$http设置为同步。
因为Angular在JavaScript上构建了一套体系,你使用这套体系编程。换句话说,你使用Angular时,不应该考虑XMLHTTPRequest,同步,异步这些概念,你应该把它们暂时忘记。你使用Angular时就是在遵守Angular的规则。在这里就是$http的语法规则。

同步没有道理,你哪怕用异步发送请求之后在网页上显示个等待中也比把网页卡住什么都做不了来得好……

如果你需要同步加载数据,那么$http对你来说毫无意义. $http底层使用的是浏览器的XMLHTTPRequest对象,这个对象是实现AJAX调用的基础. 你应该再回顾一下AJAX是个神马东东

人家说要同步。。虽说 $http不应是同步的.但他提供更低级的resouce?还是什么
有时也是有需求的,比如我这页面所有功能依赖于我将请求的东东,那么除了等待能干嘛呢
所以我干脆用同步,省的promise麻烦了

赞成的答案@杨鑫诚Bruce

.state('', { 
        url : '/main',
        ncyBreadcrumb : {
             
        },
        params : {

        },
        resolve : {
            data : function($stateParams, $q) {
                var deferred = $q.defer();
                service.functionnnnnnn(params).then(function(result) {
                    
                    deferred.resolve(result.data);
                });
                
                return deferred.promise;
            }
        },
        views : {
            'main' : {
                controller : "",
                controllerAs : "vm",
                templateUrl : ,
            }
        }
    })

加载完再进入router

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏