【问题标题】:Is that asynchronous of any javascript calling?那是任何javascript调用的异步吗?
【发布时间】:2011-08-03 06:40:59
【问题描述】:
我对javascript很陌生,不明白为什么所有javascript调用都是异步的,
例如,我们有像这样的顺序调用
call_function1;
call_function2:
如果function2依赖于function1的结果,则不能保证,因为执行是异步的。真的吗 ?为什么?
如果为真,如何确保它们是同步的。
如果这是重复的问题,我很抱歉,因为它对我来说很新鲜。
先谢谢你的回答。
【问题讨论】:
标签:
javascript
asynchronous
synchronous
【解决方案1】:
JavaScript 调用是同步的。如果第二个函数依赖于第一个函数的结果,你可以使用回调模型。
function foo(callback) {
var results = // get some results;
callback(results);
}
function boo(results) {
// do something with results here..
}
foo(boo);
【解决方案2】:
没有 Javascript 具有像其他语言一样保证顺序和行为的功能。例如:
function f1() {
alert(1);
}
function f2() {
alert(2);
}
f1();
f2();
您将总是得到 1 和 2。更重要的是,AFAIK javascript 在一个线程上运行,因此您也不必担心竞争条件。
javascript 的异步部分来自于等待事件。例如,如果您发出 2 个 ajax 请求(ajax 中的 a 代表异步是一个提示),您无法保证哪个会先返回,因此如果您对两个请求有不同的回调,您无法保证哪个会被调用首先。
【解决方案3】:
连续调用两个函数绝对不是异步的。
事实上.. javascript 是 100% 同步的。除非您使用“网络工作者”,否则所有 javascript 将始终在单个线程中运行,在单个进程中。永远不会有两个脚本同时运行的情况。
即使您处理一个事件,例如来自 XMLHTTPRequest,该事件也只会在所有其他 javascript 代码停止执行后触发。
【解决方案4】:
正如您问题的 cmets 中所述,JavaScript 函数调用通常不是异步的。以下将按顺序执行:
function sayHello() {
console.log("Hi");
}
function sayBye() {
console.log("Bye");
}
sayHello();
sayBye();
上面的代码将首先打印“Hi”,然后是“Bye”,因为对 sayHello 和 sayBye 的调用是按此顺序进行的。
但是,如果一个函数确实异步执行了某些操作,并且您有另一个依赖于该结果的函数,您可以提供第二个函数作为异步请求的回调。例如:
xmlHttpRequestObj.onreadystatechange = function() {
if(xmlHttpRequestObj.readyState == 4 && xmlHttpRequestObj.status == 200) {
//Asynchronous call returned successfully. Do something that relies on that here.
}
}
【解决方案5】:
我不知道你怎么说“Javascript 一般说是异步的”。通常情况正好相反:Javascript 几乎总是不是异步的。
所以一般来说(没有ajax,没有回调,没有事件处理),下面的函数调用会顺序执行。
function1();
function2();
如果您将这两个函数都分配给一个事件,则会同时调用这两个函数,但不会并行执行。如果两者在同时(使用setTimeout)或作为Ajax 回调调用,则相同。请参阅Is JavaScript guaranteed to be single-threaded? 以获得很好的解释。
您可能听说过 Ajax 是异步的。当您考虑对服务器的请求而不干扰用户“在后台”时,这是正确的。但这并不意味着 Javascript 是异步的。事实上,即使使用 Ajax 调用,javascript 部分也是单线程的。