【问题标题】:Is that asynchronous of any javascript calling?那是任何javascript调用的异步吗?
【发布时间】:2011-08-03 06:40:59
【问题描述】:

我对javascript很陌生,不明白为什么所有javascript调用都是异步的,

例如,我们有像这样的顺序调用

call_function1;

call_function2:

如果function2依赖于function1的结果,则不能保证,因为执行是异步的。真的吗 ?为什么?

如果为真,如何确保它们是同步的。

如果这是重复的问题,我很抱歉,因为它对我来说很新鲜。

先谢谢你的回答。

【问题讨论】:

  • Javascript 函数调用通常不是异步的。

标签: 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”,因为对 sayHellosayBye 的调用是按此顺序进行的。

        但是,如果一个函数确实异步执行了某些操作,并且您有另一个依赖于该结果的函数,您可以提供第二个函数作为异步请求的回调。例如:

        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 部分也是单线程的。

          【讨论】:

            猜你喜欢
            • 2016-08-13
            • 2016-08-03
            • 1970-01-01
            • 2017-02-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多