AngularJS随后的$ http删除等待几分钟

时间:2014-12-30 08:13:17

标签: javascript angularjs node.js

我有一个显示对象列表的表,每个对象都与任意数量的子对象相关联。我正在使用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;
            });
        },

2 个答案:

答案 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);
        },

我认为潜在的问题仍然存在。