Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jquery while循环运行太快-如何添加等待_Javascript_Jquery_Performance - Fatal编程技术网

Javascript jquery while循环运行太快-如何添加等待

Javascript jquery while循环运行太快-如何添加等待,javascript,jquery,performance,Javascript,Jquery,Performance,我有一个jquery代码,它基于计数器循环,向数据库插入一条记录,然后为插入的每条新记录打开一系列4个报告 循环根据用户在名为dropdownSection的下拉列表中提供的数字运行。每一部分;1、2或3 ajax需要插入相同数量的记录 当循环在浏览器中运行时,我得到一个无法跟踪的错误。当我在FireBug中设置一个断点并逐步完成代码时,它工作得很好。这让我觉得我的循环可能运行得太快了 以下是我的循环代码: function InsertSheeter() { var textDate

我有一个jquery代码,它基于计数器循环,向数据库插入一条记录,然后为插入的每条新记录打开一系列4个报告

循环根据用户在名为dropdownSection的下拉列表中提供的数字运行。每一部分;1、2或3 ajax需要插入相同数量的记录

当循环在浏览器中运行时,我得到一个无法跟踪的错误。当我在FireBug中设置一个断点并逐步完成代码时,它工作得很好。这让我觉得我的循环可能运行得太快了

以下是我的循环代码:

function InsertSheeter()
{
    var textDate = $('#textDate').val()
    var Workorder = $('#textWorkorder').val()
    var Material = $('#dropdownMaterial').val()
    var Shift = $('#dropdownShift').val()
    var Sheeter = $('#dropdownSheeter').val()
    var FoilNum1 = $('#textFoilNum1').val()
    var FoilNum2 = $('#textFoilNum2').val()
    var FoilNum3 = $('#textFoilNum3').val()
    var Printline = $('#dropdownPrintline').val()
    var Section = $('#dropdownSection').val()
    var Comments = $('#textComments').val()
    var Employee = $('#dropdownEmployees').val()

    var a = 0

    while (a < Section)
    {


        switch (a)
        {
            case 0:
                blockSection = "1"
                break;
            case 1:
                blockSection = "2"
                break;
            case 2:
                blockSection = "3"
                break;
        }

        var str = "{pDate:'" + textDate + "', pSheeter:'" + Sheeter + "', pShift:'"
            + Shift + "', pEmployee:'" + Employee + "', pWorkorder:'"
            + Workorder + "', pBlockSection:'" + blockSection + "', pComments:'"
            + Comments + "', pFoilNum1:'" + FoilNum1 + "', pFoilNum2:'"
            + FoilNum2 + "',    pFoilNum3:'" + FoilNum3 + "', pPrintline:'"
            + Printline + "', pMaterial:'" + Material + "'}"

        $.ajax(
    {
        type: "POST",
        //contentType: "application/text; charset=utf-8",
        url: "insertsheeter",
        data: str,
        dataType: "html",
        success: function (data) {

            OpenReports(Workorder, data);
        },
        error: function (xhr, errorType, exception)
        {

            var errorMessage = exception || xhr.statusText;
            alert(errorMessage);
        }

    });



        a++;

    }


}
函数InsertSheeter()
{
var textDate=$('#textDate').val()
var Workorder=$('#textWorkorder').val()
var Material=$('#dropdownmatterial').val()
var Shift=$('#dropdownShift').val()
var Sheeter=$('#dropdownSheeter').val()
var FoilNum1=$('#textFoilNum1').val()
var FoilNum2=$('#textFoilNum2').val()
var FoilNum3=$('#textFoilNum3').val()
var Printline=$('#dropdownPrintline').val()
var Section=$('#dropdownssection').val()
var Comments=$('#textcoments').val()
var Employee=$('#dropdownstemployees').val()
变量a=0
while(a
在继续循环之前,我是否需要在循环中设置延迟以允许其他事情发生


Thx

在您的情况下,我怀疑您需要循环等待一个AJAX插入和一组报告完成,然后再开始下一个。您可以使用递归函数而不是
while
循环执行此操作:

function myFunc() {
    $.ajax({
        /* ...options... */,
        success: function(data) {
             OpenReports(Workorder, data);
             if (some_Boolean_test) {
                 myFunc();
             };
        }
    });       
}

myFunc();

AJAX调用在默认情况下是异步的,看起来您可能在这里寻找一些同步行为

您可以通过设置

async: false

增加一个固定的延迟并不是一个一致的解决方案——如果时间是你的问题的话。您应该按照Dave的建议尝试设置
async:false
。如果这解决了你的问题,那么时间可能是你问题的一部分。固定时间延迟的问题是它们在当前条件下工作,但是如果由于某种原因“慢”部分需要更长的时间,那么您的延迟可能不够——这是一种反模式

顺便提一下,有一件事让我觉得很突出,那就是你为你的HTTP-POST数据创建了一个看起来像JSON对象的字符串,而不仅仅是一个JSON对象——你这样做有什么特别的原因吗?我会这样做:

var postData={
pDate:textDate,
希特:希特,
pShift:Shift,
员工:员工,
工作指令:工作指令,
pBlockSection:块段,
建议:意见,
pFoilNum1:FoilNum1,
pFoilNum2:FoilNum2,
pFoilNum3:FoilNum3,
pPrintline:Printline,
p材料:材料
}

然后在
$.ajax()
调用中设置
data:postData
。也许您的服务器代码需要这样一个奇怪的字符串


希望这有帮助。

如果您附加了实际的JS错误,这将非常有用。看起来像是while循环中的异步Javascript和XML,我建议使用递归函数或$.when等。您的浏览器无法并行处理针对同一域的这么多ajax请求。以某种方式限制它,或者最好只发出一个ajax请求,同时发送所有相关数据。我不知道它是什么。我在ajax错误部分有一个警告,但它确实会在屏幕上闪烁并消失。@A.Wolff ajax请求取决于A等于什么值。它将是1、2或3,具体取决于用户输入的节数。那么,我是否应该在一个ajax调用中收集所有这些数据呢?那么,我是否应该将其包装在InsertSheeter函数中包含的代码中?@Bergi使用一个ajax递归函数进行了更新,这可能会有所帮助。@Ryan递归调用基本上取代了
while
循环。但是,由于我们正在嵌套新函数,您可能需要从外部将一些变量传递到
myFunc
。我认为我从您的代码示例中没有足够的信息来告诉您具体的操作方法。我在更多地考虑故障排除和理解流程-我同意这不是一个生产解决方案。这对于我需要它做的工作非常有用。异步将为我工作。
success
error
回调是有原因的,应该改用。但奇怪的是,他已经在使用它们了。我也同意,这不仅仅是一个解决时间问题的策略。对,但你投票反对人们提出解决问题的方法。我们都明白,这并不是结束。