如何进行这种异步调用,同步

时间:2016-01-04 07:35:47

标签: angularjs asynchronous

我有一个关联数组日期作为键,在这种情况下,值是一个对象数组。现在在这个对象

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

编辑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

1 个答案:

答案 0 :(得分: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) {...} );