Javascript 我对异步操作的理解正确吗?
我正在努力理解异步的概念。以下关于异步操作的内容大致正确吗Javascript 我对异步操作的理解正确吗?,javascript,Javascript,我正在努力理解异步的概念。以下关于异步操作的内容大致正确吗 如果一段代码需要很长时间才能完成,则可能会出现问题。这是因为我)它会停止下面的代码运行,在后台加载硬代码的同时运行它可能会更好。ii)实际上,JS可能会在硬代码完成之前尝试执行下面的代码。如果下面的代码依赖于硬代码,那就是一个问题 一个解决方案是:如果一个操作需要很长时间才能完成,那么您希望在处理原始线程的同时在单独的线程中处理它。只需确保主线程不引用异步操作返回的内容。JS为此解决方案使用事件查询。异步操作在主线程之后执行的事件中执
承诺的地方。all
很有用,因为在解决fetch1和fetch2的承诺之前,它不会继续异步操作的下一步
.then
时读到过,它算作一个异步操作,因此我们可以始终保证后续的.then
仅在执行时执行。然后在执行之前
解决了它的承诺
此页面非常好地解释了Node.js事件循环(因为它是由Node.js创建的): 如果一段代码需要很长时间才能完成,则可能会出现问题。 这是因为我)它会阻止下面的代码运行,而且可能是 很高兴在后台加载硬代码的同时运行它。(及ii) 实际上,JS可能会在硬代码出现之前尝试执行下面的代码 完成了。如果下面的代码依赖于硬代码,那就是一个问题 是的,但要改写:让用户等待代码解析是糟糕的用户体验,而不是运行时错误。尽管如此,如果代码块依赖于返回未定义的变量(因为该变量尚未解析),则确实会发生运行时错误 解决方法是:如果一个操作需要很长时间才能完成,您需要 在单独的线程中处理它,而原始线程 处理。只要确保主线程不引用任何东西 异步操作返回。JS使用事件队列 这个解决方案。异步操作在事件队列中执行 在主线程之后执行 是的,但需要指出的是,这些其他线程发生在浏览器或api服务器上,而不是JS脚本中。此外,异步函数仍在主调用堆栈中调用,但它们的解析放在作业队列或消息队列中 但是,即使是que事件也会遇到与 主线程。如果位于fetch2上方的fetch1需要较长时间 是时候返回承诺了,而fetch2没有,JS可能会开始执行 在执行fetch1之前先执行fetch2。这就是承诺。一切都是有用的 因为它不会继续异步过程中的下一步 操作,直到fetch1和fetch2的承诺都得到解决 是的,只要调用堆栈中的当前函数解析,承诺的解析就会立即执行。如果一个承诺在另一个承诺之前解析,那么它的解析将在第一个事件(如果它被第二个调用)执行。还要注意的是,Promise.all不会更改解析时间,而是按照其承诺的执行顺序一起返回解析 在另一个注释中,我读过链接时的内容。那么,这也算一个 异步操作,因此我们可以始终保证后续 .then将仅在.then在执行之前|解决 它的承诺 是的,尽管更新更清晰的语法是async await:
函数A(){
返回新承诺((解析,拒绝)=>setTimeout(()=>resolve(“done”),2000))
}
异步函数B(){
试一试{
console.log(“等待…”);
常量结果=等待A();
控制台日志(结果);
}捕获(e){
控制台日志(e);
}
}
B()代码>几乎正确,但不完全正确
如果你说的是英语中的“异步”这个词,那么它只是意味着事情可能会无序发生。这个概念在很多语言中都有使用,包括Java和C/C++中的多线程
如果您讨论的是与node.js或C/C++中的异步I/O相关的异步性的具体概念,那么您确实对其在低级别的工作方式有一些误解
如果一段代码需要很长时间才能完成,则可能会出现问题。这是因为我)它会停止下面的代码运行,在后台加载硬代码的同时运行它可能会更好。ii)实际上,JS可能会在硬代码完成之前尝试执行下面的代码。如果下面的代码依赖于硬代码,那就是一个问题
当谈论C/C++中的javascript或异步I/O时(javascript的异步性来源于此),这是不正确的
实际发生的是,等待某事发生可能需要很长时间才能完成。与其等待,为什么不告诉操作系统在发生这种情况时执行一些代码(回调)
在操作系统级别,大多数现代操作系统都有API,允许您告诉它在发生某些事情时唤醒您的进程。这可能是键盘事件、鼠标事件、I/O事件(来自磁盘或网络)、系统重新配置事件(例如更改监视器分辨率)等
大多数传统语言都实现阻塞I/O。当您试图从磁盘或网络读取某些内容时,您的进程立即进入睡眠状态,而O
Traditional blocking I/O
time
│
├────── your code doing stuff ..
├────── read_data_from_disk() ───────────────────┐
┆ ▼
: OS puts process to sleep
.
. other programs running ..
.
: data arrives ..
┆ OS wakes up your process
├────── read_data_from_disk() ◀──────────────────┘
├────── your program resume doing stuff ..
▼
Non-blocking I/O (also known as asynchronous I/O)
time
│
├────── your code doing stuff ..
├────── read_data_from_disk(read_callback) ───▶ javascript stores
│ your callback and
├────── your code doing other stuff .. remember your request
│
├────── wait_for_mouse_click(click_callback) ─▶ javascript stores
│ your callback and
├────── your code doing other stuff .. remember your request
│
├────── your finish doing stuff.
┆ end of script ─────────────▶ javascript now is free to process
┆ pending requests (this is called
┆ "entering the event loop").
┆ Javascript tells the OS about all the
: events it is interested in and waits..
. │
. └───┐
. ▼
. OS puts process to sleep
.
. other programs running ..
.
. data arrives ..
. OS wakes up your process
. │
. ┌───┘
: ▼
┆ Javascript checks which callback it needs to call
┆ to handle the event. It calls your callback.
├────── read_callback() ◀────────────────────┘
├────── your program resume executing read_callback
▼
fetch(url_1).then(fetch1); // tell js to call fetch1 when this completes
fetch(url_2).then(fetch2); // tell js to call fetch2 when this completes
fetch(url_1).then(fetch1); // tell js to call fetch1 when this completes
fetch(url_2).then(fetch2); // tell js to call fetch2 when this completes
while (1) {
console.log('wait');
}