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 执行顺序问题的主要内容,如果未能解决你的问题,请参考以下文章