简体   繁体   中英

Service call in for loop angular js $q, promise

Service call in for 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 is

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

Question: $scope.weeklyData.length = 0 outside for loop. Why and how to handle this in promises?

Serivce call

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;***
    }

While calling above service, create a variable promise=[]; push all repsonses from service call, and resolve them.

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);
        }

Now resolve using $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);
        });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM