【问题标题】:Keep waiting for loop increment until not getting function response继续等待循环增量,直到没有得到函数响应
【发布时间】:2016-01-21 09:14:04
【问题描述】:

我有一个 for 循环,在里面我调用了一个函数。但是在循环变量的函数响应之前增加 1。 我只想等到响应到来,然后将 var 加 1。

这是我的代码:

    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);




                    }           


         });

【问题讨论】:

  • 只是为了说清楚,你只想在函数getDistance返回一个值后增加i的值,对吗?
  • 是的,当我从我调用的函数中获得响应时,我想增加 i 的值
  • 如果 getDistance 是异步函数,则在回调中递增
  • 怎么做请建议
  • 这是一个 for 循环,在调用函数之前和之后并没有真正的区别。您的 for 循环变量将在每次迭代时发生变化。如果你想使用另一个变量,我建议你明确地创建一个

标签: javascript


【解决方案1】:

由于 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
    }
   }); 
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2019-06-16
    相关资源
    最近更新 更多