javascript - 获取 API - 它是阻塞代码还是非阻塞代码?

标签 javascript dom ecmascript-6 promise fetch-api

这几天我一直在研究 Fetch API

在学习过程中,我遇到了声明“使用 fetch() 不会阻止您的 DOM”,因为它使用了 promises。

愉快地继续学习这些教程并查看一些新教程,我​​看到一个人在演示中说“使用 fetch() 会阻止您的 DOM”

谁能教我这是两者中的哪一个?

最佳答案

在阻塞/非阻塞代码的意义上使用 fetch 归结为同步代码和异步代码之间的区别。

JavaScript 的设计范式之一称为 Run to Completion归结为当前正在执行的一段JS代码不能被另一段代码打断。换句话说,一个函数以同步方式运行直到它完成(另请参阅最后的警告)。

当你有异步代码时,比如包裹在 promise 中的代码(fetch 正在使用的代码),它会被安排在所有同步代码运行完毕后稍后运行,以及所有其他先前计划的任务之后(microtasks 用于 promise )。

这提供了一个时间间隙,允许运行 JS 的系统的其他部分,例如浏览器中的 DOM,可以自由地操作它们与 JavaScript 引擎共享的系统部分,知道 JS 不会'不要妨碍他们。

因此,从广义上讲,fetch 是非阻塞的,不会阻塞 DOM。

应该注意的是,promises 表示通过异步调度链 (the promise chain) 连接的同步代码块,因此从技术上讲,fetch 的某些部分确实会阻塞 DOM,但可以考虑整个过程大多数情况下是非阻塞的。参见 the answer by mpen举个例子。


注意:在 ES6 中引入生成器后,函数不再是 JavaScript 中的原子执行单元。通过 yield 和之后的 await,JS 函数能够分解为多个同步执行代码的异步 block 。

关于javascript - 获取 API - 它是阻塞代码还是非阻塞代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45392913/

相关文章:

javascript - 如何访问Symbol(Symbol.toStringTag)属性?

javascript - 结合正则表达式,匹配两者,两者都不匹配

javascript - 在 moment.js Nodejs 中将毫秒转换为日期

javascript - 单击输入标签会更改整个内容

javascript - polymer 1.0 : Help using dom-if

javascript - 使用javascript查找未标记的元素

javascript - mocha - 检索 promise 测试的结果

javascript - 无法通过 Javascript 加载 Twitter 分享按钮

javascript - 如何欺骗 Node.js 将 .js 文件加载为 ES6 模块?

javascript - webpack可以将js转成es6吗?