$ Q.所有gangularjs仅适用于一个结果



我正在处理函数,该功能在借助Google距离矩阵的帮助下计算从给定对象到许多其他位置的距离,这当然是异步的,因此我正在处理承诺。

当地点数量是一个时,一切都很好。但是,一旦我有一个以上的诺言,$ q。所有人都没有做任何事情:它既没有成功,也既不是错误的。尽管我已经检查了控制台,呼叫Google距离矩阵确实会发生并返回正确的结果。有任何线索在这里可以玩什么?

我使用的是AngularJS 1.6.4。让我知道您是否需要更多细节。谢谢!

var requests = [];
for (var i = 0; i < ctrl.places.length; i += 1) {
    var deferred = $q.defer();
    requests.push(deferred.promise);
    var destination = ctrl.places[i].latLng;
    service.getDistanceMatrix({
        origins: [ctrl.origin],
        destinations: [destination[0] + "," + destination[1]],
        travelMode: 'DRIVING'
    }, function(response, status) {
        if (status === 'OK') {
            deferred.resolve(response.rows[0].elements[0].distance.text);
        }
    });
}
$q.all(requests).then(function(result) {
    ctrl.distances = result;
});

您的问题是var不是块分析,因此deferred的值将始终属于您的循环的最终迭代,此前任何回调都被调用。这一意愿的结果是,较早的递延将永远无法解决,并且$q.all似乎会悬挂。

解决此问题的最简单方法是将var的使用更改为let,以利用块范围:

let deferred = $q.defer();

原因不起作用的原因

在调用服务调用并调用回调处理程序时,deferred属性是指for循环创建的最后一个递延对象。因此,实际上,您总是在创建的最后一个deferred对象上执行resolve

解决方案:

创建一个新功能:

function getDistanceMatrixForDestination (destination, origins) {
   var deferred = $q.defer();
   service.getDistanceMatrix({
        origins: [origins],
        destinations: [destination[0] + "," + destination[1]],
        travelMode: 'DRIVING'
    }, function(response, status) {
        if (status === 'OK') {
            deferred.resolve(response.rows[0].elements[0].distance.text);
        } else {
            deferred.reject();
        }
    });
   return deferred.promise;
}

将现有代码更改为:

var requests = [];
for (var i = 0; i < ctrl.places.length; i += 1) {
    var destination = ctrl.places[i].latLng;
    requests.push(getDistanceMatrixForDestination (destination, ctrl.origins));
}
$q.all(requests).then(function(result) {
    ctrl.distances = result;
});

相关内容

  • 没有找到相关文章

最新更新