【问题标题】:Asynchronous/Synchronous Javascript异步/同步 Javascript
【发布时间】:2011-07-19 13:54:09
【问题描述】:

我在理解异步和同步 Javascript 之间的区别时遇到了一些麻烦,希望有人能对此有所了解。

我知道 Javascript 本质上是同步的,但您可以使用异步事件/回调来改变您的程序流程。但是,如果你调用一个没有包含 AJAX 回调的函数会发生什么?

例如,如果我有以下代码,其中foo() 包含某种服务器查询,foobar() 包含一些输出文本:

foo();
foobar();

会在foo()中的内部逻辑完成之前调用foobar(),还是浏览器会等到foo()完全执行后再调用foobar()? (这看起来很简单,但我的困惑来自于回调,以及它们是否在所有情况下都是绝对必要的,以控制您的程序流,即是否始终需要 foo(foobar)。)

另外,如果foo() 包含一个在客户端快速执行但在服务器上需要很长时间来处理的服务器调用,那么回调是我可以让我的程序等到foo() 完全完成的唯一方法执行完成了吗?

【问题讨论】:

    标签: javascript ajax asynchronous dom-events synchronous


    【解决方案1】:

    foobar() 确实会在 foo() 中的 Ajax 调用完成之前被调用...

    除非这是第二个问题的答案,否则您指定 Ajax 调用应该是同步的,这是一个选项。这样做会迫使用户等到调用完成后才能执行任何操作,因此这通常不是最佳选择。使用回调通常是最好的方法。

    【讨论】:

    • 此外,如果您希望 foo() 保持异步但在完成时执行 foobar(),您可以使用 foobar() 作为回调。这样你可以继续你的 JS 逻辑,但你仍然可以让某些函数在需要时等待。
    • 明白了,谢谢! kingjiv 说出了我正在寻找的确切短语 - foobar 只有在 foo 中的所有 javascript 都完成后才会被调用。我对整个事情的思考方式过于笼统,需要非常严格地和字面地思考。 :)
    【解决方案2】:

    会在 foo() 内部逻辑完成之前调用 foobar()

    这个问题的答案取决于你所说的“内部逻辑”是什么意思。只有在 foo 中的所有 javascript 完成后,foobar 才会被调用。然而,它不会等待 AJAX 调用返回(AJAX 中 A 的全部点)。

    【讨论】:

      【解决方案3】:

      所有foo 将运行,然后所有foobar 将运行。

      foo 的一部分可能会说“异步发送 HTTP 请求”,在这种情况下,它不会在继续之前等待响应返回(但由于 foo 仅触发发送请求,因此它是被认为是完整的)。

      如果有回调,那么它会在响应到达时运行(通常在foobar 完成之后)。

      【讨论】:

        【解决方案4】:

        简单来说, foo() 将在 foobar() 启动之前完全在内部执行。但是,如果在 foo() 中调用了执行 ajax 请求,则该请求将被提交,然后将并行执行。

        提交请求后,处理将继续。 ajax 请求将在完成后返回响应,该响应可能会或可能不会被进一步处理。

        【讨论】:

          【解决方案5】:

          想象一下,例如,你有这样的东西:

          var something;
          foo(); //Inside foo, the value of something is set to the result of an AJAX call
          console.log(something);
          

          console.log 行将打印 undefined,因为变量 something 仍然是空的,直到 foo 中的 AJAX 响应更改它。在这种情况下,回调很有用 - 在回调中,您可以将响应的值分配给 something,然后您就知道 something 有一个值。

          您的示例与此非常相似 - 只要foo 返回,就会调用foobar,如果foo 包含一些异步逻辑,它将在完成之前返回。如果您希望foobar 在之后执行,您需要从(或用作)回调函数调用它。

          可以让foo 等待它所做的一切完成,但这可能会破坏使用 AJAX 的意义,因为您必须发送同步请求。

          【讨论】:

            猜你喜欢
            • 2013-10-16
            • 2010-10-25
            • 2013-05-14
            • 2017-02-10
            • 2014-05-19
            • 2012-01-02
            • 2012-02-25
            • 2017-09-20
            • 1970-01-01
            相关资源
            最近更新 更多