为什么我的变量在AngularJS承诺的范围内不可用?

时间:2017-11-14 14:30:01

标签: javascript angularjs

我写了承诺从后端获取一些数据。但是函数end()不会看到我的变量包含这些数据。我做错了什么,以及如何返回overlapProjects变量?

Console.log(1和2)显示大量数据,但console.log(4)已经有空对象。

this.checkSingleInvitation = function(invitation) {
    console.log('Оверлап сингл');
    var dtoArray = [];
    var overlappingProjects = {};

    InvitationService.acceptedProjects.models.forEach(function(accepted) {
        if(!(dateHelper.parseDate(accepted.dt_from) > dateHelper.parseDate(invitation.dt_to) || dateHelper.parseDate(accepted.dt_to) < dateHelper.parseDate(invitation.dt_from))) {
            var dto = {
                target: invitation.project_has_musicians_id,
                goal: accepted.project_id
            };
            dtoArray.push(dto);
        }
    });

    var promises = [];
    angular.forEach(dtoArray, (function(dto) {
        var deferred = $q.defer();
        var overlappingProjects = {};
        //async fun
        InvitationService.checkOverlapping(dto)
            .before(function() {
                progressBars.progressbar.requestsInProgress++;
            })
            .success(function(data) {
                // TODO: overlappingProjects - ???
                if(Object.keys(data).length) {
                    console.log('1');
                    console.log(data);
                    overlappingProjects = data;
                    console.log(overlappingProjects);
                }
                console.log('2');
                console.log(data);
                deferred.resolve(data);
            })
            .error(function(error) {
                deferred.reject(error);
            })
            .finally(function() {
                progressBars.progressbar.requestsInProgress--;
            });
        promises.push(deferred.promise);
    }));
    $q.all(promises).then(console.log(promises)).then(
        end()
    );

    function end() {
        console.log('4');
        console.log(overlappingProjects);
        return overlappingProjects;
    }
}

2 个答案:

答案 0 :(得分:1)

问题似乎是你要定义overlappingProjects两次。 删除第二个定义:

  angular.forEach(dtoArray, (function(dto) {
        var deferred = $q.defer();
        var overlappingProjects = {};  //  <-- remove this line

答案 1 :(得分:0)

除了两次变量(overlappingProjects)声明之外,您还可以立即调用end函数,而不是将其作为回调传递:

$q.all(promises).then(console.log(promises)).then(
    end()
);

应该是:

$q.all(promises)
  .then(() => console.log(promises)) // may be .then(results => console.log(results)) ?
  .then(end);