异步任务在javascript中何时启动?

异步任务在javascript中何时启动?,javascript,asynchronous,event-handling,synchronous,Javascript,Asynchronous,Event Handling,Synchronous,假设一个javascript任务进行异步调用。 e、 g.xhr.发送(资料) (异步)发送是否立即在另一个线程中开始?或 在当前任务完成之前,发送是否不会开始 我很确定这是(2)后者,但这种行为是由规范涵盖的,还是仅仅是典型的实现。 同样地。。。 创建侦听器是否被视为同步调用? 是否有一个规范涵盖这一点?这个问题主要由@Alnitak回答,最终由@Alnitak回答 实现可能有所不同,但语义似乎与本摘要中概述的相同 异步调用(通常)会导致执行立即在单独的线程中开始。[例如xhr.send()]

假设一个javascript任务进行异步调用。 e、 g.xhr.发送(资料)

  • (异步)发送是否立即在另一个线程中开始?或
  • 在当前任务完成之前,发送是否不会开始
  • 我很确定这是(2)后者,但这种行为是由规范涵盖的,还是仅仅是典型的实现。 同样地。。。 创建侦听器是否被视为同步调用?
    是否有一个规范涵盖这一点?

    这个问题主要由@Alnitak回答,最终由@Alnitak回答

    实现可能有所不同,但语义似乎与本摘要中概述的相同

  • 异步调用(通常)会导致执行立即在单独的线程中开始。[例如xhr.send()]
  • 事件侦听器创建是同步进行的。[例如xhr.addEventListener()]
  • 当异步任务完成新任务时,表示异步结果的数据将添加到任务队列中
  • 事件循环读取任务队列并计算下一个任务
  • 异步结果有一个关联的回调,用于检查为结果注册的侦听器
  • 下面是一个异步任务如何工作的示例。


    正如您从代码中看到的,有几个地方将任务添加到任务队列中,调用dispatchEvent()

    好吧,它实际上是1,但我不能引用章节。@briosheje没有什么可以说浏览器不能为内部目的生成线程。这将比使用事件驱动I/O更简单,因为事件驱动I/O可能很难与面向用户的事件分派循环很好地匹配。[或者换句话说,如果您在面向用户的代码中启动了一个长期任务,您如何确保它不会阻止正在进行的AJAX请求(如果它们共享同一个事件队列)?]我认为这是(2)的原因,因为如果我同时调用xhr.send()和xhr.addEventListener()我找到的消息来源向我保证,听众不会错过正在收听的事件。在(1)的情况下,异步任务有可能在当前任务之前完成(尽管很小)。@phreed这是不同的-XHR发送的异步结果将添加到事件队列中,并且在所有当前运行的代码块完成之前不会查看事件队列。不过,您特别询问了发送何时开始。任务不是“代码行”或单个函数调用-它是作为先前触发事件的结果而当前执行的任何和所有代码。@briosheje就用户而言,Javascript在单个线程中执行(尽管WebWorkers)。不过,该实现可以随意使用线程。