2016-01-21 41 views
0

我有一个for循环,里面有一个函数。但在此之前的循环变量函数响应由1 加我只是想等到反应过来,那时由1继续等待循环增量,直到没有得到函数响应

这里增加VAR是我的代码:

for(var i=0;i<$scope.latitude.length;i++) 
     { 
       console.log("inside for :",$scope.latitude[i]); 
       console.log("i after for:" ,i); 
      console.log("count before if:" ,count); 
        if($scope.latitude[i]!=1) 
        { 

         console.log("inside if count is :",count); 
         console.log("i inside if:" ,i); 
          var lat =$scope.latitude[i]; 
          var lng=$scope.longitude[i]; 

         console.log("lat is going",lat); 
         console.log("lng is going",lng); 



         $scope.getDistance(lat,lng).then(function(response,flag){ 
         console.log("flag is" ,flag); 

         setTimeout(function(){ 

           flag="true"; 


         },1000); 

       var results = response.rows[0].elements; 

       console.log(results[0].distance.text); 
       console.log(results[0].duration.text); 
       return results[0].distance.text 


      }).done(function(distanceMatrixResult,flag) { 
        console.log("flag inside done is:" ,flag); 

         console.log("count is ",count); 
        console.log("i inside done:" ,i); 
        console.log(distanceMatrixResult); 
     $scope.clients.treasureHunts[count].distance =distanceMatrixResult; 


        $ionicLoading.hide(); 

       console.log("Results:->>>>>>>>>>>>", JSON.stringify($scope.clients)); 

})

$scope.getDistance=function(lat,lng){ 
     console.log("lat inside google distance function:-" ,lat); 
      console.log("lng inside google distance function:-" ,lng); 

      var service = new google.maps.DistanceMatrixService(); 


     $scope.destinationDetails = { 
      lat: lat, 
      lng: lng 
      } 

      console.log("destination:-" ,JSON.stringify( $scope.destinationDetails.lat)); 
     console.log("destination:-" ,JSON.stringify( $scope.destinationDetails.lng)); 
      //getting current location 
       var onSuccess = function (position) { 

      console.log('Current Position: ', position.coords.latitude, ',', position.coords.longitude); 
      $scope.originCenter = { 

       lat: position.coords.latitude, 
       lng: position.coords.longitude 

      }; 
         geocodeLatLng($scope.originCenter); 
       } 

       function onError(error) { 
      console.error('code: ' + error.code + '\n' + 'message: ' + error.message + '\n'); 
      //alert('Error Occured' + error.message); 
     } 
     navigator.geolocation.getCurrentPosition(onSuccess, onError);/////////--------------------------------- 


       function geocodeLatLng(originCenter) { 
       console.log("destination inside function:-" ,JSON.stringify( $scope.destinationDetails.lat)); 
     console.log("destination inside function:-" ,JSON.stringify( $scope.destinationDetails.lng)); 


      $scope.originDetails = new google.maps.LatLng(originCenter.lat, originCenter.lng); 
      console.log('Origin Details: ',JSON.stringify($scope.originDetails)); 
      $scope.finalDestination = new google.maps.LatLng($scope.destinationDetails.lat, $scope.destinationDetails.lng); 
      console.log('destination details: ', JSON.stringify($scope.finalDestination)); 

      service.getDistanceMatrix(

       { 
        origins: [$scope.originDetails], 
        destinations: [$scope.finalDestination], 
        travelMode: google.maps.TravelMode.DRIVING, 
        unitSystem: google.maps.UnitSystem.METRIC, 
        avoidHighways: false, 
        avoidTolls: false 
       }, 
       function (response, status) { 
        if (status !== google.maps.DistanceMatrixStatus.OK) { 

         console.error(JSON.stringify(response)); 
         d.reject(response); 



        } else { 
         console.log("returning response ",JSON.stringify(response)); 
         var flag="true"; 


        d.resolve(response,flag); 




        }   


     }); 
+0

只是为了说清楚,你只想在函数getDistance返回一个值后增加i的值,对吗? –

+0

是的,我想增加我的价值,当我会得到函数的回应,我打电话 –

+0

如果getDistance是一个异步函数,然后增加回调 – mplungjan

回答

0

因为js是单线程的(就这里所说的),所以不能有一个循环等待其他发生在js代码中的事情(就像任何执行的回调函数一样)。

循环异步调用需要将功能拆分为异步回调/成功处理程序(也可以添加一些错误处理;例如)。像这样:

function makeNextCall(i, total, onCompleted) { 

    if(i >= total) { 
    onCompleted();    // signal completion of whole iteration 
    } else { 
    makeAsyncCall(i, {      // make the asynchronous call 
    onSuccess : function() {    // define callback 
     makeNextCall(i+1, total, onCompleted); // next iteration 
    } 
    }); 
    } 
} 
相关问题