错误地多次调用Angular $ http.post

时间:2017-10-11 22:17:21

标签: 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用于防止函数耗尽内存。每次调用processGridCell都会保存一个MongoDB文档,并且调用大约12,000次。因为主节点线程永远不会为异步mongoose.save +回调节省时间,所以保存的对象永远不会GCed,并且进程耗尽内存。

我没有看到使用deasync的简单方法。我也不知道为什么使用deasync会导致客户端发出另一个POST请求,为什么删除它会阻止该请求首先发生。

我继承了一个节点/角度应用程序,我已经负责修复了一下。

发生的事情是,当提交表单时,它会调用Node.js函数,该函数需要10-20分钟才能运行。几分钟后,虽然我可以看到节点功能仍在运行,但是第二次从客户端提交相同的发布请求。我无法根除原因。此外,我在发出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>

角:

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

0 个答案:

没有答案