当前位置: 首页 > 面试题库 >

所有的JavaScript回调都是异步的吗?如果没有,我怎么知道是哪个?

裴经义
2023-03-14
问题内容

我很好奇所有的JavaScript回调是异步的,还是仅在某些情况下才是异步的。另外,我确定是什么使浏览器和Node.js的javascript代码异步(或使用异步javascript的方式)有所不同,所以我想知道在每种情况下什么才是真正的异步javascript。

我的印象是,在以下情况下,我实际上并没有编写异步代码。

function addOne(value){
  value = value + 1;
  return value;
}

function simpleMap(values, callback){
  for(i = 0; i < values.length; i++){
    val = values[i];
    val = callback(val);
    values[i] = val;
  }
  return values;
}

newValues = simpleMap([1,2,3], addOne);

但是,例如,我知道jQuery的AJAX函数是真正异步的(没有考虑到现在可用的承诺)。是什么使jQuery的AJAX异步?它涉及XHR请求是否很简单,并且在浏览器中,所有XHR请求都是异步的?

对于nodejs环境,我有同样的问题。如果节点中的某些内容涉及文件I /
O,process.nextTick,setTimeout或setInterval,那么它是否只能是异步的?为什么当我使用mongodb /
mongoose进行数据库调用之类的操作时,它是异步的?幕后到底是怎么回事?

环境是否预先确定了异步“情况”?还是有某种方法可以使自己的功能真正异步而无需利用环境的特定功能(例如xhr,节点中的文件io,process.nexttick等)?


问题答案:

我很好奇所有的JavaScript回调是否都是异步的

否。例如,所使用的回调Array#sort不是异步的,也不是所使用的回调String#replace

知道回调是否异步的唯一方法是从其文档中。通常,涉及外部资源请求(例如,ajax调用)的请求是异步的,而其他请求可能是异步的,也可能不是。

但是,例如,我知道jQuery的AJAX函数确实是异步的…

不一定,因为当前jQuery仍然具有async可设置false为强制执行同步请求的标志。(这不是一个好主意,他们会删除它,但是您 可以
。jQuery将标志传递给提供同步/异步行为的基础浏览器对象。)

是什么使jQuery的AJAX异步?

浏览器。jQuery的ajax调用使用XMLHttpRequest对象(或在某些情况下为script元素),该对象默认为浏览器提供的异步操作。

还是有某种方法可以使自己的功能真正异步而无需利用环境的特定功能…

直到最近,还没有。在第5版规范中,JavaScript 语言
基本上对线程和异步的整个概念保持沉默。只是当您进入环境时,它才会出现。使某事物异步的唯一方法是使用主机提供的功能,例如nextTickNodeJS或setTimeout浏览器上的(或(异步完成的各种操作中的任何一种))。

在2015年6月的ECMAScript第6版规范中,他们在语言中引入了 promise 。通过then此类连接到ES6 Promise的回调
总是
异步调用的(即使在连接回调时已解决Promise),因此JavaScript现在在语言级别具有异步性。因此,如果实现函数以使其返回promise而不是接受回调,您将知道then连接到该函数的回调将异步触发。



 类似资料:
  • 我是Firebase的新手,我有很多问题,因为所有的任务都是异步调用的。 谢谢!

  • 问题内容: 我从java2s.com下载了servlet-api.jar的副本。我怎么知道它是什么版本?该网站上没有参考。 编辑 啊。道歉。当我双击得到的jar中的MANIFEST.MF文件时,我应该已经列出了写字板输出的内容: 如您所见,它没有告诉我版本,因此是问题所在。 问题答案: 您可以从META-INF中获取它,也可以使用Win rar或类似的归档工具来探索jar文件的内容。 我个人更喜欢

  • 问题内容: 语法的哪一部分提供了该函数应在其他线程中运行并且是非阻塞的信息? 让我们考虑一下node.js中的简单异步I / O 是什么使它在后台发生的呢?任何人都可以准确地解释它,还是可以粘贴指向一些好的资源的链接?我到处看的地方都有很多关于什么是回调的信息,但是没有人解释为什么它实际上如此工作。 这不是关于node.js的特定问题,而是关于每种编程语言中回调的一般概念。 编辑: 我提供的示例可

  • 问题内容: 我制作的jQuery控件存在一些问题。假设您有一个下拉列表,可让您输入要查找的商品的ID,当您按ENTER键或在文本框中失去焦点时,它会通过jQuery验证您输入的ID是否正确,如果没有输入则显示警报没错 事实是,当普通用户在其中输入无效值并通过按下“提交”按钮失去焦点时,jQuery帖子将在发送表单提交后返回。 有什么方法可以检查jQuery是否处理了任何异步请求,从而不允许表单提交

  • 问题内容: 如标题所示。我该怎么做呢? 我想在forEach循环遍历每个元素并完成一些异步处理后调用。 有可能使它像这样工作吗?当forEach的第二个参数是一个回调函数,该函数一旦经过所有迭代便会运行? 预期产量: 问题答案: 不能提供这种效果(如果可以的话),但是有几种方法可以实现您想要的效果: 使用一个简单的计数器 (由于@vanuan等),这种方法可确保在调用“完成”回调之前处理所有项目。

  • 我不明白为什么我所有的bean在控制器中都是空的。我知道这是一个常见的问题,但我不是用实例化对象。 控制器: 当我请求我在上收到一个NullPointerException。 我的服务 网络配置 主要的 启动应用程序时,我可以在日志中看到bean实际上正在自动连接到控制器: 所以我不明白为什么当我试图访问控制器中的时,它是空的。我不会在任何地方用实例化控制器。 裁剪异常 编辑: 我已经删除了网页。