2014-12-30 27 views
0

我有一个表格显示对象列表,每个对象都与任意数量的子对象相关联。我正在使用Angular 1.2.20,Express 4.6.1和节点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

这似乎只是对Express API的DELETE请求的问题。如果我将按钮点击绑定到连续的GET请求,则响应会立即返回。 –

+0

更好奇 - 这似乎只发生在OS X浏览器上: 操作系统:OS X 10.9.5 Firefox版本:34.0.5 Chrome版本:39.0.2171.95 –

回答

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; 
}, 
+0

这似乎并没有改变应用程序响应到连续删除。几次删除后,Angular仍会挂起,然后完全停止响应。 Netstat显示了从Angular到Express的6个连接。我应该提到我正在使用MEAN.io堆栈,甚至他们的文章包也遭遇同样的问题,所以也许这是他们的东西。我向他们提出了一个问题:github.com/linnovate/mean/issues/987 –

0

使用$暂停时以延期的承诺似乎帮助,但是这只是取消的承诺。

这似乎显著帮助:

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

我觉得根本的问题仍然存在,虽然。

相关问题