Javascript 如何使用Angularjs正确获取变量
我想不出这个问题。我的问题是为什么我不能解决这些问题。我无法使用控制器中的响应。但我得到的6个回答都是空的。请打开控制台并按下谷歌地图下的“获取结果”按钮。您将看到未定义的数组 这是 这里是服务Javascript 如何使用Angularjs正确获取变量,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我想不出这个问题。我的问题是为什么我不能解决这些问题。我无法使用控制器中的响应。但我得到的6个回答都是空的。请打开控制台并按下谷歌地图下的“获取结果”按钮。您将看到未定义的数组 这是 这里是服务 App.factory('setData',function($q){ return { getData:function(array){ var deferred = $q.defer(); var newArray =
App.factory('setData',function($q){
return {
getData:function(array){
var deferred = $q.defer();
var newArray = [];
angular.forEach(array,function(firstBlocks,key){
var dummy = firstBlocks.chunk(9);
angular.forEach(dummy,function(last,key2){
if(key2!=0){
dummy[key2].unshift(dummy[key2-1][dummy[key2-1].length-1]);
}
});
newArray.push(dummy);
});
deferred.resolve(newArray);
return deferred.promise;
}
};
});
App.factory('getGoogleDirection',function($q){
return {
getData:function(array,mymap){
var distances = [];
var promises = []
angular.forEach(array,function(object,key){
angular.forEach(object,function(array2,key2){
promises.push(getDirection(array2));
});
});
function getDirection(array){
var wayPoints = [];
var start = array[0];
var finish = array[array.length-1];
array.pop();
array.shift();
angular.forEach(array,function(item,key){
wayPoints.push({
location:new google.maps.LatLng(parseFloat(item.lat),parseFloat(item.lng)),
stopover:true
});
});
calcRoute(new google.maps.LatLng(parseFloat(start.lat),parseFloat(start.lng)), wayPoints, new google.maps.LatLng(parseFloat(finish.lat),parseFloat(finish.lng)));
}
function calcRoute(start,waypoints,end) {
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
directionsDisplay = new google.maps.DirectionsRenderer();
directionsDisplay.setMap(mymap);
var request = {
origin:start,
destination:end,
waypoints:waypoints,
optimizeWaypoints: false,
travelMode: google.maps.TravelMode.DRIVING,
avoidHighways:false,
avoidTolls:false
};
var deferred = $q.defer();
return directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay.setDirections(response);
deferred.resolve(response);
}else{
deferred.reject(response);
alert('Error');
}
return deferred.promise;
});
}
return $q.all(promises).then(function(res){
return res;
});
}
}
});
解析承诺后,它将在其回调函数中提供解析的数据。在您的代码中,您没有使用它 更改这段代码
var dist = [];
angular.forEach(data, function (d) {
if (d) dist.push(d);
});
console.log(dist);
return dist;
看看这里
$q.allpromises在所有承诺完成时完成,但是promises数组根本不包含承诺。添加到Promissions数组的是DirectionService.route的返回值,它不是Promission。当你给$q一个不承诺去解决的时候,它就像一个承诺,被解决成相同的值。例如:
$q.when(1).then(function(x) {
alert(x);
});
将提醒“1”,即使1不是承诺
因此,您需要做的是返回一个承诺,该承诺在路由回调状态==google.maps.directionstatus.OK时解析。当你的承诺正确解决时,你可以使用距离
但是,最好是与承诺保持一定距离,因此最终结果如下:
var result = $q.deferred();
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
var distances = [];
angular.forEach(response.routes[0].legs,function(leg){
distances.push(leg.distance.value);
});
directionsDisplay.setDirections(response); //
result.resolve(distances);
}else{
result.reject('Google dan veri alımında hata yaşandı');
}
});
return result.promise;
然后您可以这样使用:$q.allpromises.ThenFunctionallDistancess{…},其中allDistances是距离的2d数组,而第一个索引对应于路线,第二个索引对应于支腿。您应该查看和。感谢您提供的信息。我会读的。我已经更新了问题。你能看看吗?谢谢你的回答。你能编辑plunker吗?实际上在这个例子中我不止一次调用directionservice。因此,只需为循环返回一个元素,即promises.pushGetDirectionAry2;我已经更新了问题,普朗克:我仍然无法得到回答。我已经给了你问题的正确答案。你的承诺不是承诺,现在你应该能够自己解决它。Stackoverflow不是一个其他人为你编码的地方,而是一个你可以提问的地方。也许桑卡桑格利愿意。祝你好运。非常感谢你的回答,但这不是解决办法。我更新了问题。谢谢你的回答。但这不是我想要的。您只需要得到一个未定义元素的数组。。循环完成后,我需要获得距离数组。请看我编辑的答案。现在它也正在渲染地图。很抱歉,数据为空。我需要知道距离。问题不在于渲染。它已经渲染了。打开控制台并查看控制台。您将看到一个空数组。。。我需要获取距离。距离数组包含距离。抱歉。不。dist是一个空数组
var result = $q.deferred();
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
var distances = [];
angular.forEach(response.routes[0].legs,function(leg){
distances.push(leg.distance.value);
});
directionsDisplay.setDirections(response); //
result.resolve(distances);
}else{
result.reject('Google dan veri alımında hata yaşandı');
}
});
return result.promise;