Angularjs 正在等待执行多个$resource
执行“getUser”函数时,不会等待解析来自(“get”函数)两个资源的所有数据,Angularjs 正在等待执行多个$resource,angularjs,q,Angularjs,Q,执行“getUser”函数时,不会等待解析来自(“get”函数)两个资源的所有数据,$scope.requests变量不包含所有数据 $scope.getUser = function (applicantUser) { get(applicantUser).then(function (result) { $scope.requests = checkDuplicateInObject('applicationId', result);
$scope.requests
变量不包含所有数据
$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;
};
我更新了代码,但出现了相同的错误使用$q.all()
,然后解决承诺
$q.all()
允许您等待一系列承诺,$q.all()将这些承诺组合成一个承诺
您的代码已更新:
$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;
};
一切都很简单,你不需要$q
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
})
附言:在这里加上——如果一些承诺失败了,$q.all失败了,不等待其他承诺。(与$q.allSettled不同)我也有同样的问题,如果在“$scope.getUser”函数中获取“result”的长度,它有时会返回正确的请求数,有时则不会返回