我很好奇所有javascript回调是异步的,还是只有在某些情况下才是异步的.此外,我确定浏览器和NodeJ之间的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函数是真正异步的(不考虑现在可用的promise ).是什么让jQuery的AJAX异步化的?它涉及XHR请求,并且在浏览器中,所有XHR请求都是异步的,这样简单吗?

对于nodejs环境,我有同样的问题. node 中的某些内容只有在涉及文件i/o、进程之类的内容时才能是异步的.nextTick、setTimeout或setInterval?为什么当我使用mongodb/mongoose进行数据库调用时,这是异步的?幕后发生了什么让事情变得如此?

异步"情况"是由环境预先确定的吗?或者,是否有某种方法可以使自己的功能真正异步,而不用利用环境中非常特定的功能(例如xhr、 node 中的文件io、process.nexttick等)?

推荐答案

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

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

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

然而,例如,我知道jQuery的AJAX函数是真正异步的...

不一定,因为目前jQuery仍然有async标志,您可以将其设置为false以强制同步请求.(这不是一个好主意,他们将删除它,但您需要can.jQuery将标志传递给提供同步/异步行为的底层浏览器对象.)

是什么让jQuery的AJAX异步化的?

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

或者有没有什么方法可以让自己的功能真正异步,而不用利用环境中非常特定的功能...

直到最近,在第五版规范中,JavaScript the language基本上对线程和异步性的整个概念保持沉默;只有当你进入环境时,它才会出现.实现异步的唯一方法是使用主机提供的函数,例如NodeJS上的nextTick(或异步完成的各种操作中的任何一种),或浏览器上的setTimeout.

在2015年6月的ECMAScript第6版规范中,他们在该语言中引入了promises.通过then等连接到ES6promise 的回调是异步调用的(即使在连接回调时promise 已经解决),因此JavaScript现在在语言级别上具有异步性.因此,如果你实现了你的函数,使它返回一个promise ,而不是接受一个回调,你就会知道连接到它的then个回调将被异步触发.

Node.js相关问答推荐

postgresql层与应用层的序列化

如何将我的Redis客户端配置为在禁用群集模式的情况下使用读取副本?

try 使用Express和连接池将数据插入MySQL数据库时出现拒绝访问错误

如何使用多个参数完成

在 azure blob 容器之间复制文件

如何在 require 方法中使用路径与node.js react ?

NPM如何管理node_modules传递依赖?

当其中一个端点不工作时,如何使用 axios.all() 调用多个 API?

将 AllowDiskUse true 添加到 node.js 中的 MongoDB 聚合?

MongoDB Atlas中的聚合触发器不起作用

来自 child_process.exec 的错误没有这样的设备或地址,管道有帮助.为什么?

使用 $in 查询时,如何获取 mongoDB 中每个唯一 ID 的 n 个文档?

当我们有esnext时,为什么我们需要nodenext typescript 编译器选项?

node.js 是否支持yields ?

为当前目录提供服务的简单文件服务器

在 express 中添加故意延迟

如何运行用 TypeScript 编写的 Mocha 测试?

在单独的模块中定义 Mongoose 模型

npm install 给出警告,npm audit fix 不起作用

避免在弹性 beantalk 中重建 node_modules