如何让jQuery等待div显示值更改为“block”,然后进行ajax调用?

时间:2014-12-30 16:22:32

标签: jquery ajax

从我对setTimeout()和setInterval()的研究看来,它似乎应该可以工作,但是在它停止等待的时候就会中断,并且控制台会输出错误信息。

我设置了一个页面来执行许多服务器端和客户端性能测试,然后执行ajax调用以将测试结果保存到数据库。它工作得很好,但最近我添加了一个浏览器测试(基于谷歌的Octane代码)。我想要做的是让jQuery等到Octane完成并产生最终得分并填充该得分的div,然后执行ajax调用以保存所有测试结果。我尝试在递归函数中使用setTimeout()来做到这一点,但代码在saveData()ajax调用之前就失败了。 Octane将运行,该函数将按预期运行并且每隔5秒继续调用一次,然后Octane完成并且函数调用saveData(),这就是它中断的地方。

这是基本的代码结构:

 ...Octane code
    ...<div id="finalScore" style="display:none;">When Octane is done, it will change display of this div to block and populate it with test score</div>

    <script>
        $(document).ready(function() {
            //set some vars
             var waitCounter = 0;


            var request = $.ajax({//this is a test of download time
                url: path to a text file
                type: "GET",
                success: function(result) {
                    //crunch some numbers

                    var requestUpload = $.ajax({//only want to do upload test if download was successful
                        url: //path to a file
                        type: 'POST',
                        data: formData,
                        processData: false,
                        contentType: false,
                        mimeType: 'multipart/form-data',
                        cache: false,
                        success: function(data) {
                            //crunch some numbers

                            waitForClientScore();//new function, replaces saveData() below

                            //saveData(nDLSpeedMbps, nULSpeedMbps, nLoopSpeedMbps, nQuerySpeedMbps, nReadSpeedMbps, nWriteSpeedMbps, nAvgLoop, nAvgQuery, nAvgRead, nAvgWrite);
                        }
                    });

                    requestUpload.fail(function(xhr, status) {
                        //handle upload fail
                    });
                }
            });

            request.fail(function( jqXHR, textStatus ) {
                //handle download fail
            });

            function clientScoreReady() {//is Octane done yet?
                var clientScoreDiv = document.getElementById('finalScore');
                var divDisplayValue = clientScoreDiv.style.display;
                return (divDisplayValue == "block");            
            }

            function waitForClientScore() {
                if (clientScoreReady()) {
                    clearTimeout(t);
                    saveData(nDLSpeedMbps, nULSpeedMbps, nLoopSpeedMbps, nQuerySpeedMbps, nReadSpeedMbps, nWriteSpeedMbps, nAvgLoop, nAvgQuery, nAvgRead, nAvgWrite);
                }
                else if (waitCounter >= 12) {//make 12 recursive calls max (60 sec)
                    clearTimeout(t);
                    console.log("timed out after 12 recursive calls");
                }
                else {//recursive function call
                    waitCounter = waitCounter + 1;
                    console.log(waitCounter);
                    t = setTimeout(waitForClientScore, 5000);
                }
            }

            function saveData(nDLSpeedMbps, nULSpeedMbps, nLoopSpeedMbps, nQuerySpeedMbps, nReadSpeedMbps, nWriteSpeedMbps, nAvgLoop, nAvgQuery, nAvgRead, nAvgWrite){

                //put all argument values into userdata struct

                $.ajax({
                    url : path to page that saves userdata to DB
                    type: "POST",
                    data : userdata,
                    success: function(data, textStatus, jqXHR) {
                        //handle success
                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                        //handle fail
                    }
                });
            }
        });
    </script>

当我执行页面并观察控制台时会发生这种情况:Octane正在运行,而waitForClientScore()函数看到Octane未完成,因此它成功递增waitCounter并在5秒内调用自身。然后当Octane完成时,Octane填充div并将其显示从none更改为block。 WaitForClientScore()看到显示是块,并调用saveData()。然后saveData()内部的ajax调用失败 - 控制台输出一条消息“$ is not defined”。

saveData()(已注释掉)在转移到waitForClientScore()之前工作正常。

我尝试将waitForClientScore()放在上传成功函数中,但是同样的事情发生在来自控制台的不同错误消息中。 waitForClientScore()一直调用自己,直到Octane完成,然后控制台输出一条消息,说waitForClientScore()不是函数。

1 个答案:

答案 0 :(得分:0)

您是否尝试过jQuery.ajax?你也可以尝试console.log(jQuery(body));这可能是因为jQuery在您当前的范围内不可用。 - battletoilet