Javascript 错误地多次调用$http.post
编辑: 我可能问错了问题。今天早上我简化了Node.js代码,问题就不再发生了。此问题似乎与deasync模块的使用有关:Javascript 错误地多次调用$http.post,javascript,angularjs,node.js,Javascript,Angularjs,Node.js,编辑: 我可能问错了问题。今天早上我简化了Node.js代码,问题就不再发生了。此问题似乎与deasync模块的使用有关: var done = false; processGridCell(cell, layers, rowCount, colCount, datasetObject, function() { done = true}); deasync.loopWhile(function(){ return !done }); 我猜deasync是用来防止函数内存不足的。每次调用pro
var done = false;
processGridCell(cell, layers, rowCount, colCount, datasetObject, function() { done = true});
deasync.loopWhile(function(){ return !done });
我猜deasync是用来防止函数内存不足的。每次调用processGridCell都会保存一个MongoDB文档,调用次数约为12000次。因为主节点线程从不给async mongoose.save+回调留出时间,所以保存的对象永远不会被GCed,并且进程内存不足
我认为使用deasync不是一个简单的方法。我也不知道为什么使用deasync会导致来自客户端的另一个POST请求,为什么删除它会首先阻止该请求的发生
我继承了一个节点/角度应用程序,负责对其进行一些修复 所发生的情况是,当提交表单时,它会调用Node.js函数,运行该函数需要10-20分钟。几分钟后,虽然我可以看到Node函数仍在运行,但第二次从客户端提交了相同的post请求。我还没能找出原因。此外,我在发出POST请求之前记录信息,但它只记录第一次,而不是第二次 这是代码,大大简化了 HTML:
<header class="text-center" data-ng-include="'/modules/core/views/header.client.view.html'"></header>
<section>
<div class="get-grid-form">
<h2>Input Grid Size</h2>
<hr>
<form name="gridSizeForm" ng-controller="gridSizeCtrl" data-ng-submit="submitGridInput()" ng-class="{'has-error': gridSizeForm.myDecimal.$invalid}" >
<div class="grid-input-form">
<p>Other Irrelevent Content</p>
<div class="get-grid-form-button" ng-show="!isLoading&&isCalculating&&!isError">
<button type="submit" class="btn btn-primary" style="width: auto; margin: 2px;">OK</button>
<button type="button" class="btn btn-primary" ng-show="!isLoading" ng-click="cancel()"style="width: auto; margin: 2px;">Cancel</button>
</div>
</div>
</form>
</div>
</section>
节点:
应用程序中是否有任何类型的
httpInterceptor
,在原始超时时会触发新请求?我不这么认为。虽然我不是100%确定在哪里可以找到它。我看到文本“拦截器”的唯一位置是在我的文件中的Angular.js文件本身。如果有一个(或多个)它将是一个工厂,如:我看到$stateParams
,这表示ui路由器。我猜模板是通过状态配置加载并绑定到gridSizeCtrl
。在模板中使用ng controller
,添加另一个控制器实例。不要两者都用。事实上,很少看到ng controller
@Phil有任何有效的用途,事实似乎并非如此。删除ng控制器会导致submit按钮不执行任何操作,因此它可能无法找到该方法。明天我将能够更仔细地研究这个问题。如果原始请求超时,应用程序中是否存在触发新请求的httpInterceptor
?我不这么认为。虽然我不是100%确定在哪里可以找到它。我看到文本“拦截器”的唯一位置是在我的文件中的Angular.js文件本身。如果有一个(或多个)它将是一个工厂,如:我看到$stateParams
,这表示ui路由器。我猜模板是通过状态配置加载并绑定到gridSizeCtrl
。在模板中使用ng controller
,添加另一个控制器实例。不要两者都用。事实上,很少看到ng controller
@Phil有任何有效的用途,事实似乎并非如此。删除ng控制器会导致submit按钮不执行任何操作,因此它可能无法找到该方法。明天我可以更仔细地调查这件事。
angular.module('module').controller('gridSizeCtrl', ['$scope', 'Upload',
'$http', '$window', '$stateParams', '$location',
function ($scope,Upload,$http,$window,$stateParams,$location)
{
$scope.submitGridInput = function() {
if ($scope.cellwidth === 'default') {
units = 'kilometers';
cellwidthval = 1;
}
$scope.upload( $scope.cellwidth, units, cellwidthval,
$location.search()['param']);
};
$scope.upload = function (cellwidth,units,widthval, params) {
$scope.isLoading = true;
console.log("This only logs once. The second request fires without this logging")
$http.post('/module/grid/create',
{ data:{someData: someData}
}).success(function(response)
{ //success code
}).error(function(response)
{ //error code
});
};
}
function moduleGridCreateFunction(req, res)
{
try
{
mongoose.find(
function(err)
{
mongoose.save(function(err)
{
mongoose.save(function(err)
{
//etc. etc. etc.
if(err)
{ res.status(400).jsonp('some error'); }
else
{ //do thing that takes 10 minutes
res.status(200).jsonp('success');
}
});
});
});
}
catch(err)
{ res.status(400).jsonp('error'); }
}