我有一个显示对象列表的表,每个对象都与任意数量的子对象相关联。我正在使用Angular 1.2.20,Express 4.6.1和Node 0.10.25。该表有一个“删除”按钮,可以调用两个API调用:
1)删除所选对象 2)删除与所选对象关联的子对象
第一次删除工作正常 - 两个API调用快速返回DELETE 200。但是,对表格的后续删除尝试会导致API调用在Chrome和Firefox中几分钟内无法返回。 Safari似乎完美无缺,奇怪的是。如果我继续尝试删除更多表项,那么页面将停止响应任何输入,直到我进行浏览器刷新。我可以看到$ http.pendingRequests中的请求填满,直到几分钟后它们才会被刷新,即使这样,它们也会被小批量刷新。
就好像angularjs没有放弃初始的API调用,这会导致后续的API调用备份。不知道为什么这适用于Safari但不适用于Chrome或Firefox。 API只是带有MongoDB的ExpressJS,但即使我只是为删除调用实现了一个空的ExpressJS控制器函数,问题仍然存在:
exports.delete = function(req, res) {
/*FormDistributionGroup.remove({_id: req.params.distGroupId},
function(err, distGroup) {
if(err) {
return res.json(500, err);
} else {
return res.json(distGroup);
}
});*/
return res.json({});
}
以下是“删除”按钮的视图代码:
<button class="btn btn-sm btn-danger" ng-click="removeDistsByGroup(distGroup._id)">Remove</button>
以下是“删除”按钮的控制器代码:
$scope.removeDistsByGroup = function(distGroupId) {
var promises = [];
promises.push(FormDistributionGroupService.delete(distGroupId));
promises.push(FormDistributionService.deleteByDistGroupId(distGroupId));
$q.all(promises).then(function() {
window.alert("Successfully removed distribution group.");
$scope.distGroupList = $scope.distGroupList.filter(function(distGroup) {
return distGroup._id != distGroupId;
});
});
}
以下是控制器调用的两个相关服务函数:
FormDistributionService:
deleteByDistGroupId: function(groupDistId) {
return $http.delete(distributeJsonPath + '/group-dist/' + groupDistId).then(function(res) {
return res.data;
});
}
FormDistributionGroupService:
delete: function(id) {
return $http.delete(distributeJsonPath + '/' + id).then(function(res) {
return res.data;
});
},
答案 0 :(得分:0)
由于您正在使用延迟对象,因此您需要使用每种方法返回正确的事件链。 看看角度文档:https://docs.angularjs.org/api/ng/service/$q
它可能可能看起来像:
deleteByDistGroupId: function(groupDistId) {
var deferred = $q.defer();
$http.delete(distributeJsonPath + '/group-dist/' + groupDistId).then(function(res) {
deferred.resolve(res.data);
});
return deferred.promise;
}
delete: function(id) {
var deferred = $q.defer();
$http.delete(distributeJsonPath + '/' + id).then(function(res) {
deferred.resolve(res.data);
});
return deferred.promise;
},
答案 1 :(得分:0)
将$ timeout与延迟承诺一起使用似乎有所帮助,但这只是取消了承诺。
这似乎有很大帮助:
remove: function(id) {
var deferred = $q.defer();
$http.delete(distributeJsonPath + '/' + id, {timeout : deferred.promise}).then(function(res) {
return res.data;
});
$timeout(function() {
deferred.resolve();
}, 5000);
},
我认为潜在的问题仍然存在。