我有一个页面,允许用户上传和映射CSV文件。完成此操作后,将通过邮寄呼叫将行发送到另一台服务器上的页面。经过将近6,00次调用(准确地说是5787次),我开始收到控制台错误“无法加载资源:net :: ERR_INSUFFICIENT_RESOURCES”。

我尝试运行CSV文件中包含100行的页面,但效果很好...但是当我尝试大型列表(超过10,000行)时,页面冻结了。

这是进行帖子调用的代码:

for (var i = 0; i < manifestRows.length; i++)
{
    $.post('http://www.otherserver.com/subfolder/handler.php', { tblName: 'foobar', thing1: manifestRows[i][0], thing2: manifestRows[i][1], thing3: manifestRows[i][2], thing4: manifestRows[i][3], thing5: manifestRows[i][4], thing6: manifestRows[i][5], thing7: manifestRows[i][6], thing8: manifestRows[i][7], thing9: manifestRows[i][8], thing10: manifestRows[i][9], thing11: manifestRows[i][10], thing12: manifestRows[i][11], thing13: manifestRows[i][12], thing14: manifestRows[i][13], thing15: manifestRows[i][14], thing16: manifestRows[i][15], thing17: manifestRows[i][16], thing18: manifestRows[i][17] }, function(data) {
    if (data.length == 0)
    {
        var currentProcessing = $('#processingCurrent').html();
        $('#processingCurrent').html(parseInt(currentProcessing) + 1);
        var progress = Math.ceil((parseInt(currentProcessing) / manifestRows.length) * 100);
        if (progress == 99)
            progress = 100;
        progress = progress + '%'
        $("#progressBar").width(progress).html(progress);
        if (progress == '100%')
        {
            $('#processdingDiv').hide();
            $('#allDone').show();
        }
    }
    else
        alert(data);
    });
}


我可以在用户端或其他服务器上放置一些代码,以防止发生此资源不足错误吗?

最佳答案

我在AngularJS应用中遇到了几乎完全相同的错误。我要做的是批量处理请求。批处理号码是相对于您的实例的,但我一次使用了1,000个呼叫。

由于很多情况都是异步发生的,因此我必须创建两个变量。 httpRequestsExpected应与批处理大小相同,具体取决于您的代码。在我的系统中,每次调用$http.$get();以获得精确值时,我都会对其递增。

var batchSize = 1000;
var httpRequestsExpected;
var httpRequestsMade = 0;

然后在http成功和错误函数中,递增httpRequestMade

要解决一个批次,并且由于http有时会挂起,我无法进行完全匹配,例如:
if(httpRequestsMade === httpRequestsExpected)
但必须这样填充:
if(httpRequestsMade >== httpRequestsExpected - (httpRequestsExpected *0.01))

然后开始下一个批处理,将起始指针增加batchSize并重置变量。这样就为进程完成提供了安全的缓冲量和时间,而无需消耗所有资源。

10-08 15:12