正如牛仔在这里的评论中所说,我们都想"以类似于这样的风格编写[非阻塞JavaScript]异步代码:
try
{
var foo = getSomething(); // async call that would normally block
var bar = doSomething(foo);
console.log(bar);
}
catch (error)
{
console.error(error);
}
Run Code Online (Sandbox Code Playgroud)
"
所以人们已经提出了解决这个问题的方法
但是这些都没有导致代码像上面的同步样式代码一样简单易懂.
那么为什么javascript编译器/解释器不能阻止我们目前称为"阻塞"的语句呢?那么,为什么javascript编译器/解释器无法处理AS上面的同步语法,如果我们以异步方式编写它?"
例如,在getSomething()
上面的处理中,编译器/解释器可以只说"这个语句是对[文件系统/网络资源/ ...]的调用,所以我会做一个注释来听取来自该调用的响应和同时继续我的事件循环中的任何东西".当调用返回时,执行可以继续doSomething()
.
您仍然可以维护流行的JavaScript运行时环境的所有基本功能
这只是对语法的一种调整,这将允许解释器在IT DETECTS一个异步操作时暂停执行任何给定的代码位,而不是需要回调,代码只是在调用异步调用后从行继续执行回报.
正如杰里米所说
JavaScript运行时中没有任何内容可以预先暂停执行给定任务,允许其他代码执行一段时间,然后恢复原始任务
为什么不?(如同,"为什么不能有?"......我对历史课不感兴趣)
为什么开发人员必须关心语句是否阻塞?计算机用于自动化人类擅长的东西(例如编写非阻塞代码).
您也许可以实现它
"use noblock"
; "use strict";
)打开整个代码页的"模式".编辑:"use noblock"
; 这是一个糟糕的选择,误导了一些回答者,我试图完全改变常见的JavaScript运行时的性质.喜欢的东西'use syncsyntax';
可能会更好地描述它.parallel(fn, fn, ...); …
通过阅读 Stack Overflow 上有关同步与异步的一些帖子,看来异步应该具有较小的开销,或者比阻塞 I/O 操作的同步调用更快:
我研究过的一些地方: 非阻塞 I/O 真的比多线程阻塞 I/O 更快吗?如何? Javascript 异步函数的开销是多少
我写了一个小型基准测试,制作 4 个 256MB 到 1GB 的文件来查看fs.readFile()
.
const {performance} = require('perf_hooks');
const fs = require('fs');
const {execSync} = require("child_process");
const sizes = [512, 1024, 256, 512]; //file sizes in MiB
function makeFiles() {
for (let i = 0; i < sizes.length; i++) {
execSync(`dd if=/dev/urandom of=file-${i}.txt bs=1M count=${sizes[i]}`, (error, stdout, stderr) => {
console.log(`stdout: ${stdout}`);
});
}
}
function syncTest() {
const startTime = …
Run Code Online (Sandbox Code Playgroud)