angularJS $ http请求'如何同步'

时间:2014-07-31 11:30:55

标签: angularjs

我觉得你发现这个问题好几千次......但我真的不能理解解决方法。

我在$http ...

中有Service个请求
app.service('getData', function ($http) {

this.getDataList = function () {
 $http.get('../content/catalog/data.json')
         .success(function(response) {
          return response;  
    })      
};

我是从app.run

打来的
    app.run(function (getData) {
      list=getData.getDataList()
    })

如果我记录list变量未定义

同步它们的方法是什么?

感谢您的帮助!!!!

3 个答案:

答案 0 :(得分:0)

你把这个调用视为同步,就像它的异步调用一样,所以当你说return response;该行在调用尚未完成时执行并且自然会得到未定义时,请使用相反回调或返回承诺:

this.getDataList = function (callback) {
 $http.get('../content/catalog/data.json')
         .success(function(response) {
          callback(response);
    })      
};

用法:

getData.getDataList(function(data){
 var list=data;
 console.log(data);
});

编辑: 关于promises,这个想法非常简单,只要你有一个你希望不会立即完成的异步操作,即ajax调用,你可以使用该方法返回的promise做出异步操作,以便找出任务的时间。结束。

例如$http默认返回一个承诺,因此您只需返回$http调用本身就可以更改代码以利用该承诺:

this.getDataList = function () {
   return $http.get('../content/catalog/data.json');
}

然后像这样使用它:

getDataList().then(function(successData){
   var list=successData;
},function(errorResponse){
   alert("something terrible has happened!");
})

$http返回的承诺需要2次回调,第一次是成功通话,第二次是错误。

现在我主要只是将回调传递给进行异步调用的函数,使我不必编写then()

答案 1 :(得分:0)

列表未定义,因为您忘记在this.getDataList()

中返回$ http.get

顺便说一句,$ http将返回一个 promise (一个带有then和finally方法的对象),你可以直接在ng-bind中使用它。

答案 2 :(得分:-1)

请改用promises

JavaScript使用promise进行异步(延迟)操作。这些承诺基于回调(我保证在完成后运行你的回调)。

getDataList在幕后执行http.get并且不会阻止代码。它只返回一个promise对象 您可以向异步操作完成时将发生的promise对象添加回调。

app.service('getData', function ($http) {    
    this.getDataList = function () {
         return $http.get('../content/catalog/data.json');
    }; 
});

app.run(function (getData) {
   getData.getDataList().then(function(res){
      list = res
   });
});