Waiting multiple $resource to execute

86 views Asked by At

When 'getUser' function is executed does not wait to resolve all data from ('get' function) two resources and the $scope.requests variable does not have all data

     $scope.getUser = function (applicantUser) {
        get(applicantUser).then(function (result) {
            $scope.requests = checkDuplicateInObject('applicationId', result);
            $scope.displayHistory = true;
        }, function (error) {
        });
    };


    var checkDuplicateInObject = function (propertyName, inputArray) {
        var temp = [], result = [];
        for (var i in inputArray) {
            if (temp.indexOf(inputArray[i][propertyName]) != -1) {
                result.splice(temp.indexOf(inputArray[i][propertyName]), 1);
                result.push(inputArray[i]);
            } else {
                temp.push(inputArray[i][propertyName]);
                result.push(inputArray[i]);
            }
        }
        return result;
    };

    var get = function (applicantUser) {
        var defer = $q.defer();
        var u = {};
        var temp = [];
        var promise1, promise2;
        $scope.requests = [];
        if (applicantUser !== undefined && applicantUser.length >= 2) {
            if (!isNaN(applicantUser) && angular.isNumber(+applicantUser)) {
                u.userSerialNumber = applicantUser;
            } else {
                u.userLogonName = applicantUser;
            }

            ListUserInfoSN.post(u).$promise.then(function (result) {
                    result.forEach(function (user) {
                        promise1 = GetListOfRequestsPerUser.get({
                            userId: '', newUserSerialNumber: user.userSerialNumber
                        }).$promise;
                        promise2 = GetListOfRequestsPerUser.get({userId: user.userId, newUserSerialNumber: ''})
                            .$promise;
                    }, function () {
                    });
                    $q.all([promise1, promise2]).then(function (result) {
                        result[0].data.forEach(function (request) {
                            request.request.forEach(function (r) {
                                if (r[2] == r[3]) {
                                    r[5] = 'success';
                                } else {
                                    r[5] = 'warning';
                                }
                                if (r[4] == true) {
                                    r[5] = 'danger';
                                }
                            });
                            temp.push(request);
                        });
                        result[1].data.forEach(function (request) {
                            request.request.forEach(function (r) {
                                if (r[2] == r[3]) {
                                    r[5] = 'success';
                                } else {
                                    r[5] = 'warning';
                                }
                                if (r[4] == true) {
                                    r[5] = 'danger';
                                }
                            });
                            temp.push(request);
                        });
                        defer.resolve(temp);
                    });
                }, function () {
                    promise1 = GetListOfRequestsPerUser.get({userId: '', newUserSerialNumber: applicantUser}).$promise;
                    promise2 = GetRequestsById.get({requestId: applicantUser});
                    $q.all([promise1, promise2]).then(function (result) {
                        result[0].data.forEach(function (request) {
                            request.request.forEach(function (r) {
                                if (r[2] == r[3]) {
                                    r[5] = 'success';
                                } else {
                                    r[5] = 'warning';
                                }
                                if (r[4] == true) {
                                    r[5] = 'danger';
                                }
                            });
                            temp.push(request);
                        });
                        result[1].data.forEach(function (request) {
                            request.request.forEach(function (r) {
                                if (r[2] == r[3]) {
                                    r[5] = 'success';
                                } else {
                                    r[5] = 'warning';
                                }
                                if (r[4] == true) {
                                    r[5] = 'danger';
                                }
                            });
                            temp.push(request);
                        });
                        defer.resolve(temp);
                    });
                }
            );
        } else {
            u = {};
            temp = [];
            $scope.displayHistory = false;
        }
        return defer.promise;
    };

I update the code but i have the same error

2

There are 2 answers

1
Srdjan On BEST ANSWER

Use $q.all() and then resolve the promise.

$q.all() allows you to wait on an array of promises, $q.all() will combine these into a single promise.

Your code updated:

$scope.getUser = function (applicantUser) {
  get(applicantUser).then(function (result) {
      $scope.requests = result;
  }, function (error){
      console.log(error);
  });
};

var get = function (applicantUser) {
  var defer = $q.defer();
  var temp = [];

  var promise1 = GetListOfRequestsPerUser.get({userId: '', newUserSerialNumber: applicantUser}).$promise;

  var promise2 = GetRequestsById.get({requestId: applicantUser}).$promise;

  $q.all([promise1, promise2]).then(function(result) {

    // GetListOfRequestsPerUser
    result[0].data.forEach(function (request) {
      temp.push(request);
    });

    // GetRequestsById
    result[1].data.forEach(function (request) {
      temp.push(request);
    });

    defer.resolve(temp);
  });

  return defer.promise;
};
0
Petr Averyanov On

Everything is rather simple, you dont need $q.defer:

var promise1 = smth1.then(...);
var promise2 = smth2.then(...);

return $q.all([promise1, promise2]).then(function (promisesResultArray) {
   // promisesResultArray[0] is result of first promise
   // promisesResultArray[1] is result of second promise
   return whateverYouwant; //or simply promisesResultArray
})

P.S.: To add here - if some of promises fails, $q.all fails and doesnt wait for other promises. (And there is nothing like $q.allSettled)