Angularjs Angular.JS循环继续运行,而循环中的服务调用正在等待承诺

Angularjs Angular.JS循环继续运行,而循环中的服务调用正在等待承诺,angularjs,callback,angular-promise,q,Angularjs,Callback,Angular Promise,Q,“AddDistance”是一个插入DB函数, 问题是hash[k][2]值随着循环向前跳,而“distance”(服务承诺)仍在等待,因此我将错误的行插入到我的数据库中 在运行“AddDistance()”之前,我如何保持循环不跳到下一个对象,我是否应该使用Q$,While,.then() 我尝试了上面的方法,但失败了,可能是做得不对 请告知 for (var k in hash) { GoogleMaps(hash[k][0], hash[k][1], funct

“AddDistance”是一个插入DB函数, 问题是hash[k][2]值随着循环向前跳,而“distance”(服务承诺)仍在等待,因此我将错误的行插入到我的数据库中

在运行“AddDistance()”之前,我如何保持循环不跳到下一个对象,我是否应该使用Q$,While,.then()

我尝试了上面的方法,但失败了,可能是做得不对

请告知

 for (var k in hash)
    {
         GoogleMaps(hash[k][0], hash[k][1], function (x) {
            var distance = x.rows[0].elements[0].distance.value;
            distance = parseInt(distance / 1000);
            AddDistance({ CityID1: hash[k][2], CityID2: $scope.CompanyCity.Id, DistanceKM: distance });
            console.log(distance);
            //return distance;

        });

    }

您可以执行以下操作,但它不会保持循环:

var loopPromises = [];
var distanceList = [];

for (var k in hash) {
    var deferred = $q.defer();
    loopPromises.push(deferred.promise);
    //sample of a long-running operation inside loop...
    distanceList[k] = GoogleMaps(hash[k][0], hash[k][1], function (x) {
        var distance = x.rows[0].elements[0].distance.value;
        distance = parseInt(distance / 1000);
        AddDistance({ CityID1: hash[k][2], CityID2: $scope.CompanyCity.Id, DistanceKM: distance });
        console.log(distance);
        //return distance;
        deferred.resolve(distance);
    });    
};

$q.all(loopPromises).then(function () {
    console.log('forEach loop completed. Do Something after it...');
    //use the distanceList here
});

请注意,只要下一次迭代不依赖于上一次迭代,这种方法就可以正常工作。

您可以通过将承诺链接在一起而不是并行运行来确保长时间运行的操作一次运行一个。不过,需要注意确保正确传递参数,因为在调用任何长时间运行的函数之前,循环已经完成

因为函数是按顺序执行的,所以可以将结果存储在数组中,并确保它们是按顺序执行的

var promise = $q.resolve();
var distances = [];

for (var k in hash) {
    promise = chainPromise(promise, callGoogleMaps, k);
};

promise.then(function () {
    console.log('forEach loop completed. Do Something after it...',
      distances);
});

function chainPromise(promise, fn, k) {
    return promise.then(function() { return fn(k); });
}

function callGoogleMaps(k) {
    return $q(function(resolve) {
       //sample of a long-running operation inside loop...
       GoogleMaps(hash[k][0], hash[k][1], function (x) {
         var distance = x.rows[0].elements[0].distance.value;
         distance = parseInt(distance / 1000);
         AddDistance({ CityID1: hash[k][2], CityID2: $scope.CompanyCity.Id, DistanceKM: distance });
         console.log(distance);
         distances.push(distance);
         resolve();
       });
    });
}

您好,当您将其拆分为两个不同的范围时,您会产生一个新问题,现在我需要知道如何将循环中的哈希[k][0],哈希[k][1]与$q同步。我还需要传递参数:哈希[k][2]和距离响应检查如何使用resolve返回距离的更新谢谢您的帮助,我事先很抱歉,但在接下来的两天内,我将无法给你反馈,直到我了解你的答案为我带来的所有新领域