gpt4 book ai didi

javascript - 所有的javascript回调都是异步的吗?如果不是,我怎么知道哪些是?

转载 作者:IT老高 更新时间:2023-10-28 21:57:04 26 4
gpt4 key购买 nike

我很好奇是否所有 javascript 回调都是异步的,或者是否仅在某些情况下才如此。另外,我确定是什么让浏览器和 nodejs 之间的 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、process.nextTick、setTimeout 或 setInterval 之类的内容,它是否只能是异步的?为什么当我使用 mongodb/mongoose 执行数据库调用之类的操作时,这是异步的吗?幕后发生了什么事情?

异步“情况”是由环境预先确定的吗?或者有什么方法可以让自己的函数真正异步而不利用环境的非常具体的功能(例如 xhr、node 中的文件 io、process.nexttick 等)?

最佳答案

I'm curious as to whether all javascript callbacks are asynchronous

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

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

However, for example, I know that jQuery's AJAX functions are truly asynchronous...

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

What is it that make jQuery's AJAX asynchronous?

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

Or is there some way to make one's own function truly asynchronous without leveraging very specific functions of the environment...

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

在 2015 年 6 月的 ECMAScript 第 6 版规范中,他们将 promises 引入了该语言。回调通过 then 连接到 ES6 promise ,这样 总是 异步调用(即使在附加回调时 promise 已经解决),因此 JavaScript 具有异步性现在在语言层面。所以如果你实现你的函数,让它返回一个promise而不是接受一个回调,你就会知道与它 Hook 的then回调将被异步触发。

关于javascript - 所有的javascript回调都是异步的吗?如果不是,我怎么知道哪些是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19083357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com