【问题标题】:Angular Promises returning q.all( ) with empty arrayAngular Promises 返回 q.all() 和空数组
【发布时间】:2016-01-13 01:48:20
【问题描述】:

我想要达到的目的是这样的:

  • 调用我的服务以检索与医生相关的预约类型(类型数量不固定)中的所有预约
  • 如果有 3 种约会类型,则将进行 3 次异步调用
  • 在所有 3 个 Promise 都已解决后,使用 $q.all() 返回一个 Promise

约会服务

this.getAllDoctorAppointments = function (doctor, appointmentTypeArray) {

        var promises = [];

        angular.forEach(appointmentTypeArray, function (appointmentType) {

            var defer = $q.defer();

            $http.get('/appointments/?doctorName=' + doctor + '&apptType=' + appointmentType)
                .success(function (listOfAppointments) {

                    defer.resolve(listOfAppointments);
                    promises.push(defer.promise);

                });
        });

        return $q.all(promises);

    };

在我的控制台日志中,约会类型返回 [ ]。 发生这种情况是因为即使在进行 3 次异步调用之前就返回了空的“promises”数组。我对承诺的概念还很陌生,解决这个问题的最佳方法是什么?谢谢!

$scope.getAllDoctorAppointments = function (doctor, appointmentTypeArray) {

    appointmentService.getAllDoctorAppointments(doctor, appointmentTypeArray)

        .then(function (appointmentType) {

//could take in any number. hardcoded 3 just for testing.
console.log(appointmentType)

            angular.forEach(appointmentType[0], function (xRay) {
                $scope.xRayAppts.events.push(xRay);
            });

            angular.forEach(appointmentType[1], function (ctScan) {
                $scope.ctScanAppts.events.push(ctScan);
            });

            angular.forEach(appointmentType[2], function (mri) {
                $scope.mriAppts.events.push(mri);
            });

        });

};

【问题讨论】:

  • 不需要var defer,但同时如果你没有在成功回调中推送承诺,它会起作用......太晚了......把它推到@987654324之外@

标签: angularjs angular-promise


【解决方案1】:

promise 没有被添加到数组中,因为将它添加到数组中的代码 promises.push(defer.promise); 位于您尝试延迟的事物的结果代码中。因此,在执行之前,promise 不会被添加到要执行的 promise 列表中!

所以您可以将推送线移到成功调用之外,如下所示:

angular.forEach(appointmentTypeArray, function (appointmentType) {

        var defer = $q.defer();

        $http.get('/appointments/?doctorName=' + doctor + '&apptType=' + appointmentType)
            .success(function (listOfAppointments) {

                defer.resolve(listOfAppointments);

            });
        promises.push(defer.promise);

    });

或者,您可以按照 lcycool 的建议进行操作,直接将 $http.get(...).success(...) 调用添加到数组中。

【讨论】:

    【解决方案2】:
    this.getAllDoctorAppointments = function (doctor, appointmentTypeArray) {
        var promises = [];
    
        angular.forEach(appointmentTypeArray, function (appointmentType) {
    
            promises.push($http.get('/appointments/?doctorName=' + doctor + '&apptType=' + appointmentType)
                .success(function (listOfAppointments) {
                    return listOfAppointments;
                });
            );
        });
    
        return $q.all(promises);
    };
    

    $http.get返回你想要收集的promise,在这种情况下不需要新的defer。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多