我从来没有听说过Q_oper8,所以我不能评论它,但我会从另一个方向来。我首先听说过异步,其次是 Fiber(及其辅助库),实际上我不喜欢后者。
纤维的缺点
其他 Javascript 开发者不熟悉
Fiber 通过编译的 Fiber 本地方法将协同程序的概念引入 Javascript,该方法接管传递给它的 Javascript 代码的解释,拦截对 yield 的调用以跳回等待的协同程序。
这对你来说可能无关紧要,但如果你需要在团队中工作,你必须向你的成员传授这个概念(或者希望他们对其他语言的概念有经验,比如 Go)。
不支持 Windows
因此,为了使用 Fiber 或任何基于它编写的库,您必须首先为您的平台本地编译它。我不使用 Windows,但请注意 Windows 不支持 Fiber,因此限制了您自己的库的实用性。这意味着您将找不到用 Fiber 编写的通用 Node.js 库根本(无论如何,您可能不会找到,因为它增加了一个成本高昂的编译步骤,否则避免使用异步)。
浏览器不兼容
这意味着您使用 Fiber 编写的任何代码将无法在浏览器中运行,因为您无法将本机代码与浏览器混合(作为浏览器用户,我也不希望您这样做) ),即使您编写的所有内容都是“Javascript”(语法上是 Javascript,但语义上不是)。
更难调试
虽然“回调地狱”在视觉上可能不那么令人愉悦,但持续传递风格确实有一个非常好的优点,它比协同例程要好——您可以从调用堆栈中准确地知道问题发生在哪里,并且可以向后追溯.协程在程序中不止一个点进入函数,可以退出三种调用:return、throw和yield(),其中后者也是返回点。
使用协同程序,您可以在“同时”运行的两个或多个函数之间进行交叉执行,并且您可能在事件循环上同时运行一组以上的协同程序。使用传统的回调,您可以保证函数的外部范围在执行所述函数期间是静态的,因此您只需在需要时检查这些外部变量一次。协程需要在每个 yield() 之后运行这些检查(因为它与原始协程的使用将被转换为真正的 Javascript 中的回调链)。
基本上,我认为协程 concept 变得更难使用,因为它必须存在于 Javascript 事件循环的内部,而不是作为一种方法实施一个。
是什么让异步“更好”?
越差越好
实际上,这是一种“越差越好”的想法。 Async 不是扩展 Javascript 语言来尝试摆脱它的缺陷(并创建新的,在我看来),而是一个纯 Javascript 解决方案来掩盖它们,就像化妆一样。
控制流显式
Async 函数描述了需要跨越事件循环障碍的不同类型的逻辑流程,并且该库涵盖了实现该逻辑所需的回调代码的实现细节,您只需提供它应该大致运行的函数它们将在事件循环中执行的线性顺序。
如果您愿意放弃异步方法的参数周围的第一个缩进级别,那么与 Co-Routines 相比,您没有额外的缩进,并且只有少量的额外行 function(callback) { 声明,如下所示:
var async = require('async');
var someArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
async.forEach(someArray,
function(number, callback) {
//Do something with the number
callback();
}, function(err) {
//Done doing stuff, or one of the calls to the previous function returned an error I need to deal with
});
在这种情况下,您知道您的代码使用的所有变量只有在您的代码没有被您的代码更改的情况下才能在您的代码运行之前被更改,因此您可以更轻松地调试,并且只有一个“返回”机制:callback()。您要么在成功时不进行任何回调,要么在出现问题时将错误传递给回调。
代码复用并不难
上面的示例使代码重用变得困难,但并非必须如此。您始终可以将命名函数作为参数传递:
var async = require('async');
// Javascript doesn't care about declaration order within a scope,
// so order the declarations in a way that's most readable to you
async.forEach(someArray, frazzleNumber, doneFrazzling);
var someArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
function frazzleNumber(number, callback) {
// Do something to number
callback();
}
function doneFrazzling(err) {
// Do something or handle error
}
函数式,非命令式
异步模块不鼓励使用命令式流控制,并鼓励(要求,对于跨事件循环的部分)使用函数进行流控制。
函数式风格的优点是您可以轻松地重用循环体或条件,并且您可以创建新的控制流“动词”以更好地匹配您的代码流(由非常async 库的存在),例如为函数调用顺序实现依赖图解析的async.auto 控制流方法。 (您指定一系列命名函数并列出它依赖执行的其他函数(如果有),auto 首先运行“独立”函数,然后根据其依赖函数完成的时间运行下一个可以运行的函数正在运行。)
不是编写代码以适应您的语言规定的命令式风格,而是按照问题的逻辑编写代码,并实现“粘合”控制流以使其发生。
总结
Fiber,就其扩展 Javascript 语言的本质而言,无法在 Node.js 中开发大型生态系统,尤其是当 Async 在外观部门获得 80% 的份额时,并且没有协同程序的其他缺点在 Javascript 中。