异步/同步JavaScript

4
我有些困惑于理解异步和同步Javascript之间的区别,希望有人能够解释一下。
我知道Javascript本质上是同步的,但你可以使用异步事件/回调来改变程序流程。然而,如果你调用一个不带回调的函数,其中包含AJAX,会发生什么呢?
例如,如果我有以下代码,其中foo()包含某种服务器查询,foobar()包含输出文本:
foo();
foobar();
foo()内部逻辑执行完毕前,foobar()会被调用吗?还是浏览器会等待foo()完全执行完毕再调用foobar()?(看似简单,但我的困惑源于回调函数,是否必须在所有情况下使用回调函数来控制程序流程,例如foo(foobar)是否总是必要的。)
另外,如果foo()包含一个在客户端快速执行但需要较长时间在服务器上处理的服务器调用,那么回调是唯一的方法,使得程序能够等待foo()完全执行结束后再继续执行吗?
5个回答

3

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

除非你指定Ajax调用应该是同步的,这是一个选项。这样做会强制用户等待调用完成后才能做任何事情,所以通常不是最好的选择。使用回调函数通常是最好的方法。


此外,如果您希望foo()保持异步但在完成后执行foobar(),则可以使用foobar()作为回调函数。这样,您可以继续进行JS逻辑,但仍然可以使某些函数等待(如果需要的话)。 - Aaron Ray
明白了,谢谢!kingjiv说了我正在寻找的确切短语 - 只有在foo中所有javascript完成后,才会调用foobar。我一直过于笼统地思考这整个问题,需要非常严格和字面地思考。 :) - sichinumi

2
这个问题的答案取决于"internal logic"的含义。只有在foo中的JavaScript全部完成后,才会调用foobar。但它不会等待AJAX调用返回(这也是AJAX的主要目的)。

1

所有的foo都会运行,然后所有的foobar都会运行。

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

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


1
简单来说,foo() 会在 foobar() 开始前完全内部执行。然而,如果 foo() 内部有调用执行 ajax 请求的操作,该请求将被提交,并且将在并行中执行。
一旦请求被提交,处理将继续。当 ajax 请求完成并返回响应时,可能会通过进一步处理拾取或不拾取。

1

比方说,想象一下你有这样一个东西:

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具有一个值。

您的示例与此非常相似 - foobar将在foo返回后立即调用,如果foo包含一些异步逻辑,它将在完成之前返回。如果您想要在之后执行foobar,则需要从回调函数中调用它(或使用它)。

虽然可以让foo等待其完成操作,但这可能会破坏使用AJAX的目的,因为您将不得不发送同步请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接