服务呼叫循环Angular JS $ Q,承诺



loop angular js $ q,Promise

   var FULLWEEKDAYS = [MONDAY, TUESDAY ... SATURDAY]
    for (var i=0; i< FULLWEEKDAYS.length; i++) {
                var reqParams = {
                    weekday: FULLWEEKDAYS[i],
                    teacherId : 97
                }
                TimetableService.getTeachersOccupancy(reqParams, function (data) 
    {
                    if (data) {
                        $scope.weeklyData.push(data);
                    }
                }, function (err) {
                    //message.error('Timetable', err.data);
                });
            }

serivice Call是

function getTeachersOccupancy(data, successFunction, errorFunction) {            
var params = $.param(data);
        AjaxHandlerFactory.AjaxGet(BASETIMETABLEPATH + 'occupancy?' + 
params, {}, function (response) {
            successFunction(response.data);
        }, function (error) {
            errorFunction(error);
        });
    }

问题: $scope.weeklyData.length = 0外部循环。为什么以及如何在承诺中处理此问题?

serivce呼叫

function getTeachersOccupancy(data, successFunction, errorFunction) {
        // /SchoolAdminWS/services/schools/{schoolCd}/timeTable/occupancy?classroomId={classroomId}&date={YYYY-MM-DD}
        var params = $.param(data);
        ***var deferred = $q.defer();***
        AjaxHandlerFactory.AjaxGet(BASETIMETABLEPATH + 'occupancy?' + params, {}, function (response) {
            successFunction(response.data);
            ***deferred.resolve(response.data);***
        }, function (error) {
            errorFunction(error);
            ***deferred.reject(error);***
        });
        ***return deferred.promise;***
    }

在呼叫上述服务时,创建一个变量promise = [];从服务调用中推动所有repsons,然后解决它们。

var promises = [];
        for (var i=0; i< FULLWEEKDAYS.length; i++) {
            var reqParams = {
                weekday: FULLWEEKDAYS[i],
                teacherId : vm.employeeProfileId
            }
            var promise = TimetableService.getTeachersOccupancy(reqParams, function () {}, function () {});
            promises.push(promise);
        }

现在使用$ q.all()

解决
$q.all(promises).then(function(value) {
            vm.weeklyData = value;
            console.log(vm.weeklyData);
            setTeacherOccupancyData(value);
            vm.isSearch = true;
        }, function (reason) {
            console.log("Promise Rejected:" + reason);
        });

最新更新