2016-01-04 5 views
1

У меня есть ассоциативный массив date как ключ, значение в этом случае представляет собой массив объектов. Сейчас в этом объектеКак сделать этот асинхронный вызов синхронным

while (tempDate < endDate) { 
    $scope.dates.push(tempDate.format("DD-MM-YYYY")); 
    var dailyTrips = response.data[tempDate.format("DD-MM-YYYY")]; 
    for (var i = 0; i < dailyTrips.length; i++) { 
     // console.log(moment(dailyTrips[i].trip.startTime).format("hh:mm a")); 
     // console.log(moment(dailyTrips[i].trip.endTime).format("hh:mm a")); 
     geocode(dailyTrips, i);  
    } 
    tempDate.add(1, 'days'); 
} 
$scope.data = response.data; 

var geocode = function(dailyTrips, i) { 
    (function() { 
     var latlng = { 
      lat: dailyTrips[i].trip.source.latitude, 
      lng: dailyTrips[i].trip.source.longitude 
     }; 
     console.log(latlng); 
     var geocoder = new google.maps.Geocoder; 
     geocoder.geocode({ 
      'location': latlng 
     }, function(result, status) { 
      if (result[1]) { 
       console.log(result[1].address_components[0].long_name+" "+result[1].address_components[2].long_name); 
      } 
     }); 
    }(i)); 
}; 

Этот код работает, но работает в совершенно разные времена, так как это обратный вызов. Я хотел иметь это все за один раз, чтобы я мог использовать его в ng-repeat и показать все красиво. Как мне это сделать? Ожидаемый результат

Trip StartTime Trip from 
Trip EndLine  Trip To 

EDIT 1: До сих пор не работает

while (tempDate < endDate) { 
    $scope.dates.push(tempDate.format("DD-MM-YYYY")); 
    var dailyTrips = response.data[tempDate.format("DD-MM-YYYY")]; 
    var promises = []; 
    for (var i = 0; i < dailyTrips.length; i++) { 
     promises[i] = geocode(dailyTrips, i); 
    } 
    $q.all(promises).then(function(result) { 
     console.log(result); //line 39 
    }); 
    tempDate.add(1, 'days'); 
} 
$scope.data = response.data; 

     }, function(error) { 
      console.log(error.data); 
     }); 

    var geocode = function(dailyTrips, i) { 
    var q = $q.defer(); 
    var latlng = { 
     lat: dailyTrips[i].trip.source.latitude, 
     lng: dailyTrips[i].trip.source.longitude 
    }; 
    console.log(latlng); 
    var geocoder = new google.maps.Geocoder; 
    geocoder.geocode({ 
     'location': latlng 
    }, function(result, status) { 
     console.log(status); 
     if (status === google.maps.GeocoderStatus.OK) { 
      console.log(result[1].address_components[0].long_name + " " + result[1].address_components[2].long_name); 
      q.resolve(result[1].address_components[0].long_name + " " + result[1].address_components[2].long_name); 
     } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) { 
      setTimeout(function() { 
       geocode(dailyTrips, i); 
      }, 500); 
     } else { 
      q.reject(); 
     } 
    }); 
    return q.promise; 
}; 

enter image description here

ответ

3

Вы не можете сделать синхронную асинхронной вызова, за исключением того, блокируя код, который вы бы не не хотят делать. Вместо этого я предлагаю вам конвертировать геокод в обещание

var geocode = function(dailyTrips, i) { 
    return this.$q((resolve, reject) => { 
     .... 

, а затем ждать, пока все обещания завершить

var promises = []; 
for (var i = 0; i < dailyTrips.length; i++) { 
    promises[i] = geocode(dailyTrips, i);  
} 
$q.all(promises).then(function(results) {...}); 
+0

кажется «перспективным» ... Будет ли реализовать, и пусть это вы знаете, в один миг. .. –

+0

Я отредактировал вопрос. Он все еще не работает ... Не могли бы вы указать на недостаток? Проблема в том, что внешняя оперативность быстро оценивает все обещания и не ждет обещаний решить ... Как я могу бороться с этой проблемой? –

+0

Я предлагаю вам удалить IFFE, и вам нужно поставить '$ scope.data = response. data; 'в обратном вызове'. then' –

Смежные вопросы