Javascript 把我的AngularJS电话搞得一团糟
我遇到了一个问题我正在将一些json文件解析为html页面,URL位于另一个json文件中:我遇到了一个大问题,因为没有检测到错误,我得到了一个空页面,所以在使用一些警报进行调试时,我发现我的控制器得到了一个空列表: 我应该按通知的顺序拨打电话:Javascript 把我的AngularJS电话搞得一团糟,javascript,angularjs,Javascript,Angularjs,我遇到了一个问题我正在将一些json文件解析为html页面,URL位于另一个json文件中:我遇到了一个大问题,因为没有检测到错误,我得到了一个空页面,所以在使用一些警报进行调试时,我发现我的控制器得到了一个空列表: 我应该按通知的顺序拨打电话: alert(tab[i]+ " 1"); alert(list+ " 2"); alert(list+ " 3"); 但是我得到了这个订单: alert(tab[i]+ " 1"); alert(list+ " 3"); alert(li
alert(tab[i]+ " 1");
alert(list+ " 2");
alert(list+ " 3");
但是我得到了这个订单:
alert(tab[i]+ " 1");
alert(list+ " 3");
alert(list+ " 2");
这是我的密码
app.factory('myapp',['$http',函数($http){
函数getLists(){
$http.get('url').success(函数(数据){
返回数据;
var选项卡=[];
对于(i=0;i<(数据)。长度;i++){
tab.推送(数据[i]);
}
var列表=[];
对于(i=0;i由于您的格式设置,我不确定所有问题,但您的匿名成功处理程序的第一行似乎返回了数据,然后您继续执行for循环,因为您从该函数返回了一个值。由于您的格式设置,我不确定所有问题,但它确实存在ems表示匿名成功处理程序的第一行返回数据,然后进入for循环,该循环可能永远不会执行,因为您从该函数返回了一个值。由于您试图在for循环中发出异步请求,由于异步请求的性质,返回顺序完全不一致.您必须确保退货订单符合以下要求,即允许您按顺序解决承诺
app.factory('listsFactory', ['$http', '$q', function($http, $q) {
function getLists() {
return $http.get('url').success(function(tabs) {
return $q.all(tabs.map(function(tab) {
return $http.get(tab)
.then(function(res) {
return res.data;
});
}));
})
}
return {
getLists: getLists
};
}]);
然后,像这样使用getlist
:
app.controller('myController', ['listsFactory', function(listsFactory) {
listsFactory.getLists().then(function(lists) {
// do something with lists
// $scope.something = lists;
});
}]);
稍微细分一下:设置选项卡的第一个循环似乎是多余的,因为回调参数包含您想要的数据(除非我遗漏了什么)。因此,只需命名arg选项卡
,然后将一个新的承诺数组传递给$q.all
并返回该值。当调用getlist
时,它将返回一个承诺,其中包含每个承诺值的数组,按顺序排列
app.factory('listsFactory', ['$http', '$q', function($http, $q) {
function getLists() {
return $http.get('url').success(function(tabs) {
return $q.all(tabs.map(function(tab) {
return $http.get(tab)
.then(function(res) {
return res.data;
});
}));
})
}
return {
getLists: getLists
};
}]);
要详细说明成功
回调参数:
$http.get('url').success(function(data) {
var tab = [];
for (i = 0; i < (data).length; i++) {
tab.push(data[i]);
}
...
$http.get('url').success(函数(数据){
var选项卡=[];
对于(i=0;i<(数据)。长度;i++){
tab.推送(数据[i]);
}
...
您在这里所做的工作是不必要的,因为您正在有效地克隆数据
,这样它就是一个新数组,具有相同的值,但命名为选项卡
。您可以通过命名成功
回调参数选项卡
,来避免这种情况。这将包含与您的版本完全相同的数据,并且减少冗余。由于您试图在for循环中发出异步请求,由于异步请求的性质,返回顺序完全不一致。您必须使用类似的内容确保返回顺序,这允许您按顺序解析承诺
app.factory('listsFactory', ['$http', '$q', function($http, $q) {
function getLists() {
return $http.get('url').success(function(tabs) {
return $q.all(tabs.map(function(tab) {
return $http.get(tab)
.then(function(res) {
return res.data;
});
}));
})
}
return {
getLists: getLists
};
}]);
alert(tab[i]+ " 1");
alert(list+ " 3");
alert(list+ " 2");
然后,像这样使用getlist
:
app.controller('myController', ['listsFactory', function(listsFactory) {
listsFactory.getLists().then(function(lists) {
// do something with lists
// $scope.something = lists;
});
}]);
稍微细分一下:设置选项卡的第一个循环似乎是多余的,因为回调参数包含您想要的数据(除非我遗漏了什么)。因此,只需命名arg选项卡
,然后将一个新的承诺数组传递给$q.all
并返回该值。当调用getlist
时,它将返回一个承诺,其中包含每个承诺值的数组,按顺序排列
app.factory('listsFactory', ['$http', '$q', function($http, $q) {
function getLists() {
return $http.get('url').success(function(tabs) {
return $q.all(tabs.map(function(tab) {
return $http.get(tab)
.then(function(res) {
return res.data;
});
}));
})
}
return {
getLists: getLists
};
}]);
要详细说明成功
回调参数:
$http.get('url').success(function(data) {
var tab = [];
for (i = 0; i < (data).length; i++) {
tab.push(data[i]);
}
...
$http.get('url').success(函数(数据){
var选项卡=[];
对于(i=0;i<(数据)。长度;i++){
tab.推送(数据[i]);
}
...
您在这里所做的工作是不必要的,因为您正在有效地克隆数据
,这样它就是一个新数组,具有相同的值,但命名为选项卡
。您可以通过命名成功
回调参数选项卡
,来避免这种情况。这将包含与您的版本完全相同的数据,并且减少冗余
alert(tab[i]+ " 1");
alert(list+ " 3");
alert(list+ " 2");
您将按以下顺序获得订单,因为$http
回调函数中的警报(列表+“2”)
是异步的。因此不保证何时调用回调函数
但是,警报(列表+“3”)
将在for循环完成后立即执行。即,对for循环进行异步调用,但不会回调函数
这就是您在收到警报(列表+“2”)
之前收到警报(列表+“3”)的原因
app.factory('myapp',['$http','$q',函数($http,$q){
函数getLists(){
$http.get('url').success(函数(数据){
返回数据;
var选项卡=[];
对于(i=0;i<(数据)。长度;i++){
tab.推送(数据[i]);
}
var列表=[];
var承诺=[];
对于(i=0;i
您将按以下顺序获得订单,因为$http
回调函数中的警报(列表+“2”)
是异步的。因此不保证何时调用回调函数
但是,警报(列表+“3”)
将在for循环完成后立即执行。即,对for循环进行异步调用,但不会回调函数
这就是您在收到警报(列表+“2”)之前收到警报(列表+“3”)的原因
app.factory('myapp',['$http','$q',函数($http,$q){
函数getLists(){
$http.get('url').success(函数(数据){
返回数据;
var选项卡=[];
对于(i=0;i<(数据)。长度;i++){
tab.推送(数据[i]);
}
var列表=[];
var承诺=[];
对于(i=0;i