2017-07-01 79 views
0

我有一个名为$ scope.propname的名单,其中有一个名为latlong的对象,所以我需要找到所有属性从特定位置的距离,所以这里是我在做什么

for (var i = 0; i < $scope.propname.length; i++) { 
    if ($scope.propname[i].latlong == "") { 
    var pptlatlong = ("" + "," + ""); 
    } else { 
    var pptlatlong = $scope.propname[i].latlong.replace(/\s*,\s*/g, ","); 
    } 
    var latlongdata = { 
    scoord: $scope.loclatlong, 
    ecoord: pptlatlong 
    } 
    $http({ 
    method: 'post', 
    data: latlongdata, 
    url: $rootScope.ServiceBaseUri + 'Map/geolocation' 
    }).then(function successCallback(resp) { 
    $scope.latlongdist = resp.data; 
    }, function errorCallback(resp) {}); 
    $scope.propname[i].dist = $scope.latlongdist; 
} 

因此,所有在列表中的命名DIST对象是相同的值后的整个循环ends.It应该是HTTP响应循环继续之前,我想所有的属性不同的是,有办法等到的HTTP每个循环结束,然后继续?

+0

不要使用'$ scope'属性作为计算公式的临时变量。 – Claies

+0

@Claies你的意思是我保存http action的响应的范围? – Melvin

+0

不要使用'$ scope.latlongdist';如果使用'$ scope',则只应附加到您实际打算在HTML中显示的'$ scope'属性。您的计算失败,因为即使有多组坐标,每组都共享一个输出变量。 – Claies

回答

0

一个更好的办法,

var loclatlong = $scope.loclatlong, 
    geolocUrl = $rootScope.ServiceBaseUri + 'Map/geolocation'; 

$scope.propname.forEach(function(prop, index) { 

    if(prop.latlong === "") { 
     var pptlatlong = (""+","+ ""); 
    } else { 
     var pptlatlong = prop.latlong.replace(/\s*,\s*/g, ","); 
    } 

    var latlongdata = { 
     scoord: loclatlong, 
     ecoord: pptlatlong 
    }; 

    $http({ 
     method: 'post', 
     data: latlongdata, 
     url: geolocUrl 
    }) 
    .then(
     function(res) { 
      $scope.propname[index].dist = res.data; 
     }, 
     function(err) { 
      console.log(err); 
     } 
    ); 
}); 
0

您的for循环中一切都得到异步调用返回之前执行。

只需分配你的价值观的.then内,如:

$scope.propname[i].dist = response.data; 

重要:的更好的方法是存储阵列中的所有承诺和只使用propname值时,所有的人都得到了解决。这样你就可以确保你不会遗漏任何未解决的值。

+0

我试着在$ http成功内部赋值,但是我得到了一个错误“dist of undefined” – Melvin

+0

您需要检查为什么'$ scope.propname [i]'是未定义的。 @Melvin – tiagodws

+0

,因为它在$ http响应之前循环,不等待它 – Melvin