JavaScript将最终获得正确的异步编程

时间:2021-11-14 10:03:22

JavaScript将最终获得正确的异步编程

JavaScript将最终获得正确的异步编程

包括该提案异步 在ECMAScript中的功能已经达到第四阶段; 这意味着它将在2017年发布的标准。但是这对JavaScript开发者意味着什么?

有很多的利益在异步,JavaScript的需要并行轻松执行多种功能的能力。

“因为JavaScript是单线程的,这意味着如果您有任何长时间运行工作,它必须是异步的为您的应用程序保持响应或者它只是阻止和你的浏览器将冻结,说:” 安德斯·海尔斯伯格,C#的首席架构师现在也是一个核心开发人员为微软的打字稿transpiler 为JavaScript。因此,JavaScript运行时库和所有的框架被设计成只有异步的做事方式。如果你想做一个昂贵的操作,如XML HTTP请求,你不会阻塞和等待结果; 你得到提供回调,稍后调用你的结果。

“那里有很大的兴奋; 人们都在期待时,他们可以使用异步功能,而不transpilation,说:“ 布赖恩Terlson,从微软的边缘球队,谁是ECMAScript标准的编辑以及”关于异步提议冠军“ TC39委员会的标准化的ECMAScript。当他推特,异步建议已经达到第四阶段,它有更多的转推比任何他的推文。

Follow
Brian Terlson @bterlson
Async functions are now stage 4 and will be included in ES2017!
8:47 AM - 29 Jul 2016
435 435 Retweets 552 552 likes
“异步编程模型允许开发人员立即提出他们所有的问题。然后开发人员对这些答案做出反应。该应用程序不断适应,因为它来的信息,用户体验一个动态的应用程序,而不是被强迫等待一个*的时间完美填妥的视图更新自己,说:“ 函数naveed Ihsanullah Mozilla的平台工程团队,部分是因为它将使代码更容易理解。

“异步编程对于开发最佳用户体验非常重要。信息在许多地方,现代应用程序寻求将所有这些不同的来源无缝地集成到一个连贯的视图中。然而,即时加载和完成的网页都是幻觉。在幕后,代表用户进行了大量的信息请求。其中一些是快速回答,有些可能需要更长时间。有些人可能完全没有回答,“他说。

整个网络平台正在这个方向移动,指出Terlson。异步 进入的ECMAScript 2017“的事实,即在平台的东西越来越多是异步的,所以你的代码最终不得不面对更多的不同步的反映。与网络工作者交谈是一种异步的事情,任何种类的网络。存储API是异步的。服务工作者正在做一堆网络东西,所以他们是异步的。新的流API有很多异步条吧。随着新API的添加,我们只是发现越来越多的异步源,因为平台的能力增长,所以它渗透到你的代码。

添加异步API的增长意味着JavaScript需要在代码中比回调更好的处理方式。“如果你只有一个异步源,一个回调是可以的,但如果你有很多它的吸引力,这也是痛苦的性能原因与许多功能创建和抛弃。”基本上,注意Terlson,在HTML 文档对象模型 (DOM),一遍又一遍,效率不高。

使异步可承载
他认为异步 作为在回调的“巨大的进步”,因为“有金字塔的-厄运没有嵌套回调”和Ihsanullah同意。

“虽然异步编程有很多好处,但是以这种方式编写应用程序通常很复杂和乏味。JavaScript语言已低电平异步设施,如XMLHttpRequest的,多年。这些低级的基于回调的构造非常难以使用,难以维护和难以调试。他们可能恶化的源代码,以回调地狱多重嵌套的请求进行的。Asynct有障碍大大减少编写高质量的维护异步代码的潜力。这些开发者的好处直接转换为更响应的应用程序为用户,因为使用更多的异步。

在许多方面,这是JavaScript赶上其他语言,如C#,它开创了异步编程,异步将在JavaScript中工作的方式非常类似于它在C#中处理,Hejlsberg说。这使得代码更容易阅读和思考。

“JavaScript是一个单线程执行环境。如果你想要任何事情发生由于异步,你必须通过回调或有人必须打电话给你,因为只有一个执行线程。如果有人拥有它,他们必须放弃,让你跑。所以从一开始,JavaScript的总是喜欢回调的setTimeout或类似DOM事件; 所有这一切发生的人打电话给你回来。

问题是代码结构变得多么复杂,有很多回调,以及使得它如何工作,Hejlsberg说。“逻辑往往变得更加复杂; 如果你必须有条件分支,或者你必须有等效的for循环,但在循环中间的异步调用?你可以尝试做自己的映射,你必须将你的状态提升为共享对象或共享变量并维护它,但你基本上必须自己写一个状态机。状态机是计算机是非常好的推理,人类是可怕的推理!

Async负责处理,他解释说。“事实证明,你可以机械变换,它的使用CPS写在常规顺序风格融入异步代码的代码,继续处理风格代码重写。你可以重写任何使用带有返回的同步函数调用的程序,并将它们转换为接受回调的函数 - 这就是异步。你可以编写代码,就像它是同步的,然后编译器将它重写为基于异步回调的代码,并将代码转换为状态机。

这是最好的方式来思考新的异步/等待功能,他建议。“在使用await操作符等待异步工作的地方,编译器自动从其余代码中调用回调。

“最大的好处是你能够以你自己的方式编写代码。如果你需要一个if语句,你写一个if语句,如果你需要一个for循环你写一个for循环,在里面你可以说await然后控制返回,然后回来,每当异步工作完成。人们都非常兴奋,因为它使你的代码看起来更清洁,它很容易推理你的代码。

正如Terlson所说,“在大多数情况下,你不必担心调用异步API的事实; 你只是等待它,去你的一天。如果promise被拒绝,你会得到异步抛出的异步,所以你可以写异步代码看起来像同步代码和处理错误与正常的同步命令式代码。

你仍然有重构。“当你使一个函数是一个异步函数,调用它的代码得到一个promise而不是一个值,所以你需要改变调用代码async,以及等待结果。”但是这是更容易做async因为代码本身不太复杂。“你甚至可以等待非诺言。有一些API返回promises,但有时如果他们知道一个值同步他们只是返回它,所以如果你等待API结果正确的事情会发生。

能够使用这些熟悉的同步模式编写代码,同时获得异步的所有好处“大大简化了为动态和响应式Web应用程序编写代码”Ihsanullah说。他建议将其视为“JavaScript承诺和生成器的句法包装”,并指出“理解这些特性将极大地方便开发人员理解异步”,“承诺的经验可能是强制性的”。

了解异步及其相关函数await是基于generator和promise将帮助你处理更复杂的异步代码,他说。“等待目前只允许一次等待一件事。然而,开发者意识到这些异步函数是promise,然后可以使用await Promise.all(...)等待几个动作。

浏览器准备异步
有一点,异步似乎是一个有争议的提案。Terlson解释说:“有一些关于是否祝福的承诺,因为异步模式是正确的选择,或者更像是可以换掉其他东西的任务。但在那个阶段不曾有过超出了许多实现微软的浏览器的边缘(如开始早在2015年9月在边缘13.10547试验性的功能,并移动到没有前缀的版本在Windows内幕预览建立14986)。

“然后,谷歌的V8开始实现它,因为我们得到了更多的实施经验,人们确信有没有性能问题等等,这有助于。”

另外,解释Ihsanullah,JavaScript需要那些构建模块的异步:promises和generator。“虽然承诺,由于可以在JavaScript中实现,已经在浏览器中使用了几年,生成器是最近的一种语言添加。”获得语法以反映开发人员使用函数的方式很重要。“它从箭头开始。然后发电机。现在异步函数。对标准委员会和社会来说,语言的人体工程学是重要的。

现在异步功能在启用了镀铬,因为铬55(谷歌的杰克阿奇博尔德称他们 “非常坦率地奇”),他们已经在Firefox中自2016年11月(该计划是支持他们在Firefox 52)夜间释放。歌剧院 42及更高版本支持异步,它是正在开发的Safari。

Transpilers
而像transpilers 巴贝尔和打字稿,你甚至可以编写异步代码,有它在旧的浏览器中运行,以及作为信心它会在最新的浏览器工作,因为他们增加的支持。

这是一个大量的工作,支持异步发电机没有,这就是为什么它曾经只可能在打字稿到transpile异步代码ECMAScript的2015年,和巴贝尔有着不同的技术 对其中的ECMAScript版本要根据目标。但现在TypeScript 2.1让你一路回到ECMAScript 3,Hejlsberg说。

“一旦你将代码重写为一个状态机,如果你有生成器,那么转换是相对简单的 - 重写一个async函数,等待它到一个生成器几乎是微不足道的。但是如果你没有生成器,它是更复杂 - 因为现在你必须包围一个状态机在你的代码周围,有效地每个地方,你看到等待,函数必须返回,然后当控制回来,它必须跳回并继续执行。因为JavaScript中没有gotos,这很复杂。所以你必须用一个switch语句写一个while循环,然后保存一堆机器发明的状态。在你的代码发生的重写是复杂的,得到重写正确并不简单。

“使用TypeScript 2.1,我们切换到新的发射器; 这是编译器的后端。它是一个树写作者,重写你的语法树,以使这些新的状态机和其他奇怪的东西,你必须做,所以我们现在支持重写异步等待ECMAScript 3。它不只是做简单的情况下,你只能使用在顶层等待,而不是在一个初始化或对象字面量的属性 - 不,它是一个运算符像任何其他,所以就像你可以说加,你可以说等。

浏览器和转换器不是唯一需要支持异步的地方才能成为主流; 框架和库也需要支持它。“如果你想写异步风格的代码,但你有一堆框架,不是那种风格,那些框架仍然会做回调,”他指出。“如果你有一个基于promise的库,你正在编码的异步工作。然而,通常,库不是基于promise的,然后你必须promisify或找到一个promisified版本的相同的功能。这将是一个挑战,因为这是将你从回调连接到异步世界的粘合剂。

期待着花时间发生。“与任何事情一样,它不会在一夜之间发生,但会有一个越来越渐进的变化和现代框架写入现在将使用promises所有的异步 - 这意味着它将更容易使用异步代码。这将是这个波,慢慢地洗过去,而不是发生在一夜之间的东西。

宣布异步将在ECMAScript 2017将有助于这一点。Terlson预测,图书馆作者必须在一段时间内完成异步操作,但他们现在可以相信它是JavaScript的未来发展方向,所以他们可以使用它,而不必担心它会被未来的语言变化所打破。

当然,编写异步JavaScript对许多开发人员来说是新的。“如果你今天没有使用转换器,你没有使用异步函数,”Terlson指出。任何已经使用async的人都是早期采用者,但随着ECMAScript 2017向批准的方向发展,现在是开始考虑如何改进代码的时候了。
原文链接