我觉得你发现这个问题好几千次......但我真的不能理解解决方法。
我在$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
变量未定义
同步它们的方法是什么?
感谢您的帮助!!!!
答案 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
});
});