正如牛仔在此处的评论中所说,我们都希望“以类似于以下的样式编写 [非阻塞 JavaScript] 异步代码:
try
{
var foo = getSomething(); // async call that would normally block
var bar = doSomething(foo);
console.log(bar);
}
catch (error)
{
console.error(error);
}
”
所以人们想出了这个问题的解决方案,比如
但是这些都不会导致代码像上面的同步样式代码一样简单易懂。
那么为什么 javascript 编译器/解释器不可能只阻止我们目前称为“阻塞”的语句?那么为什么 javascript 编译器/解释器不可能处理上面的同步语法,就像我们以异步风格编写它一样?”
例如,在getSomething()
上述处理过程中,编译器/解释器可以只说“这个语句是对[文件系统/网络资源/...]同时继续处理我的事件循环中的任何内容”。当调用返回时,可以继续执行doSomething()
。
您仍将保留流行的 JavaScript 运行时环境的所有基本功能
- 单线程
- 事件循环
- “异步”处理的阻塞操作(I/O、网络、等待计时器)
这将是对语法的简单调整,这将允许解释器在检测到异步操作时暂停任何给定代码位的执行,并且不需要回调,代码只是在异步调用之后从行开始返回。
正如杰里米所说
JavaScript 运行时中没有任何东西会抢先暂停给定任务的执行,允许其他一些代码执行一段时间,然后恢复原始任务
为什么不?(例如,“为什么不能有?”......我对历史课不感兴趣)
为什么开发人员必须关心语句是否阻塞?计算机用于自动化人类不擅长的事情(例如编写非阻塞代码)。
你也许可以用
- 像这样的声明
(有点像"use noblock"
;"use strict";
)为整页代码打开这个“模式”。编辑:"use noblock"
; 是一个糟糕的选择,并误导了一些回答者我试图完全改变常见 JavaScript 运行时的性质。类似的东西'use syncsyntax';
可能会更好地描述它。 - 某种
parallel(fn, fn, ...);
语句允许您在 in 中并行运行"use syncsyntax"
;模式 - 例如允许同时启动多个异步活动 - 编辑:一个简单的同步样式语法
wait()
,将用于代替setTimeout()
in"use syncsyntax"
;模式
编辑:
举个例子,而不是写(标准回调版本)
function fnInsertDB(myString, fnNextTask) {
fnDAL('insert into tbl (field) values (' + myString + ');', function(recordID) {
fnNextTask(recordID);
});
}
fnInsertDB('stuff', fnDeleteDB);
你可以写
'use syncsyntax';
function fnInsertDB(myString) {
return fnDAL('insert into tbl (field) values (' + myString ');'); // returns recordID
}
var recordID = fnInsertDB('stuff');
fnDeleteDB(recordID);
该syncsyntax
版本的处理方式与标准版本完全相同,但更容易理解程序员的意图(只要您理解syncsyntax
暂停执行所讨论的此代码)。