Javascript 执行顺序问题

Posted

技术标签:

【中文标题】Javascript 执行顺序问题【英文标题】:Javascript Order Of Execution Issue 【发布时间】:2011-08-30 16:09:32 【问题描述】:

我遇到了 javascript 以对我来说没有意义的顺序执行事物的问题。

发生的事情如下

var bValid = false;
alert(bValid + " 1");
if(validateForm() == TRUE)

    $.get("submit_manageUsers.php",  
        action: sendAct, userID: userID,  
        function(responseText)
          
            if(responseText == "GOOD")
            
                alert("Update Successful");
                bValid = true;
                alert(bValid + " 2");
            
            else
            
                alert(responseText + "\n Update Unsuccessful");
                bValid = false;
            
        ,  
        "html"  
    );     
    bvalid = true;
    alert(bValid + " 3");

alert(bValid + " 4");
if(bValid == true)

    //do something

alert(bValid + " 5");

编辑:添加更多实际发生的事情以防万一,可能会知道我是如何做事的!

上述代码的输出如下所示:

假 1

假2

假 4

假 5

真的 3.

这里的问题是 if(bValid == true)if(validateForm() == TRUE) 之前执行,所以这意味着 bValid 始终为 false。

为什么那部分代码在另一部分之前执行?

非常感谢您对此的任何帮助!

【问题讨论】:

TRUE 是函数 validateForm() 应该返回的值,以将 bValid 变量也设置为 TRUE。 请创建一个jsfiddle.net 来产生这个输出。如果未定义TRUE,则代码将失败并且不会产生任何进一步的输出。如果已定义,则输出将有所不同。在我看来,输出的顺序是不可能的。 jsfiddle 会支持 jQuery 吗? 哦.......alert(bValid + " 2") 在你的 ajax 回调函数中!!! @Adam:你可以点击链接看看;)但是现在你添加了更多信息,问题就很清楚了。 【参考方案1】:

Javascript 区分大小写。 validateForm()返回一个布尔值对吗?所以它要么是真的,要么是假的。 TRUE 与 true 相同。

if (validateForm() == true)  // do something. 

我什至会更进一步并使用严格等于:

if (validateForm() === true)  // do something. 

另外,bvalid 与 bValid 相同。

在未来,我建议使用众多 JavaScript 工具中的一种来帮助查找语法错误(例如 jsfiddle、jslint、jsbin 等)。我们都会犯错误,有时这些简单的小细节会让人头疼。尽管 YUI 和 Google 有语法检查工具可以提供帮助,但没有用于 javascript 的编译器拐杖(就像我每天使用 C# 一样)。

谷歌 - http://code.google.com/closure/

雅虎! - http://developer.yahoo.com/yui/

在原始问题中提供了更多信息后 -

您正在对您的 PHP 页面进行异步调用,这可能需要 1 秒或 30 秒。

http://api.jquery.com/jQuery.ajax/

JQuery ajax(支持 .get 函数)默认是异步。但是,您可以覆盖它并使其同步。

【讨论】:

我希望这是一个语法错误,但我只是在输入问题时匆匆忙忙,所有变量在真实代码中都拼写相同,我认为这与 jQuery .get 以及如何运行,但不完全确定它是如何工作的! 我想看看那个 validateForm() 函数。 您正在对您的 PHP 页面进行异步调用,这可能需要 1 秒或 30 秒。【参考方案2】:

您无需在这些条件下指定 true 或 false。试试这样的方法,看看它是否能解决您的问题:

var bValid = false; 
alert(bValid + " 1"); 

if (validateForm())  
    bvalid = true; 
    alert(bValid + " 2"); 
 

alert(bValid + " 3"); 
if (bValid) 
    //do something 
 

alert(bValid + " 4"); 

【讨论】:

【参考方案3】:
var bValid = false;
alert(bValid + " 1");

if(validateForm() == TRUE)
    bvalid = true;
    alert(bValid + " 2");

alert(bValid + " 3");

setTimeout(function()  // Continue le script après l'insertion du html
    if(bValid == true)
        //do something
    
    alert(bValid + " 4");
, 0);

这样,您的脚本的第一部分应该在开始第二次验证之前完成。 希望对您有所帮助。

【讨论】:

【参考方案4】:

$.get 是异步的。这意味着您发送消息,挂断电话,然后等待 jQuery 在处理完submit_manageUsers.php 后给您回电。 Step 3 和 Step 4 是在挂断电话后完成的,而 Step 2 只发生在回调被调用之后,这可能需要一段时间。这就是为什么您的消息有问题。

$.get(url, data, function(response)  
    if (response == 'GOOD') 
       alert('success!');
       DoSomethingMeaninfulHere();
     else 
       alert(response + "\n Update Unsuccessful");
    
);

你必须打电话给

// DoSomethingMeaningfulHere
alert(bValid + " 4");
if(bValid == true)

    //do something

alert(bValid + " 5");

在回调的内部,让它在正确的时间执行(在 AJAX 请求完成之后)

【讨论】:

以上是关于Javascript 执行顺序问题的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 执行顺序问题

html+javascript 执行顺序问题

Javascript中代码的执行顺序是啥?

如何确保JavaScript的执行顺序

JavaScript执行顺序详解

JavaScript执行顺序详细介绍