一、Promises.js

在当今世界,计算机编程语言变得越来越先进,使用技术的方法也发生了变化。 这是由于技术随着业务和需求的快速变化而出现的事实。 电子设备业务的大规模扩张已经促使大学、研究人员和工业部门投资开发最新的技术和工具,从而催生了许多新的计算机语言。

然而,JavaScript 并非如此。 这是相对较新。 它已经被现代编程界使用和抛弃了至少三次,现在被广泛接受为在今天的网络空间中开发现代、可伸缩的实时 web 应用的工具。

在 90 年代中期,互联网时代诞生了。在这段时间里,公司都想要主导刚刚诞生的网络市场。 虽然这是一个虚拟的地方,没有实际存在,但争夺统治地位的战争达到了顶峰。 网景通信公司想要一种自己的轻量级解释语言变体,通过吸引非专业程序员来补充 Java。 这个任务交给了 Brendan Eich,他开发了 JavaScript 的第一个版本,并命名为“Mocha”。 1995 年 9 月在网景浏览器 2.0 测试版中首次发布时,它的官方名称是 LiveScript。

但是,当 2.0 B3 版本推出时,名称被更改为 JavaScript。 自 1995 年以来,JavaScript 经历了许多起起落落。 有关于它被收养,被拒绝,再被收养的故事。 在推出后不久,JavaScript 在整个行业得到了非常普遍的反应。 每个大公司都对它的增长做出了贡献,并根据自己的需要进行了微调。

JavaScript 的兴衰

Netscape 浏览器见证了 JavaScript 在 90 年代末和 2000 年初的衰落。 web 开发的面貌日趋成熟,但仍然很少有人对投资 JavaScript 感兴趣。

正是因为 Mozilla 基金会的出现,才在 2002 年初至 2003 年发布了第一个开源浏览器 Firefox,因为它是前 Netscape 浏览器的继承者。 他们在产品中再次使用了 JavaScript。 2004 年,谷歌推出了异步 JavaScript 和XML(AJAX)。 这为许多技术奠定了基础,并通过最小化服务器调用,使黑白色前端和服务器之间的通信变得容易。

谷歌对 JavaScript 的贡献

谷歌在 JavaScript 的发展、开发和利用方面做出了比其他任何组织都多的贡献。 谷歌在其旗舰网页浏览器 Chrome 中引入了 V8 引擎。 V8 是浏览器的骨干引擎,由于 JavaScript 的聪明使用,浏览器更快,健壮,并适应于 web 和 Android 设备。

2009 年,Node.js 与 Chrome 基于相同的 V8 引擎问世。 这是 JavaScript 的服务器端,但比 Netscape 在 90 年代末引入的要好得多,先进得多。 Node.js 的整体思想是开发非阻塞的输入/输出(I/O),并且只需要几行代码,服务器就可以在给定的时间槽内服务多达 20K 的客户端。

在 Node.js 之后不久,整个开发栈的名字是 MEAN 栈,它是 MongoDB、Express.js、Angular.js 和 Node.js 的首字母缩写; 其中 MongoDB 是基于文档的,NoSQL 是基于 javascript 的数据库,Express.js 是表示层,Angular.js 是应用的前端开发,Node.js 是运行整个程序的服务器。

promise .js 从何而来?

你们谁都知道如何在一个服务器端脚本执行 I / O 事件知道读或写数据与一个驱动器在本质上是阻塞的,也就是说,在其执行,没有其他操作可以由一个服务器端语言,即使是客户端。 有了 promise .js,情况就不再是这样了。 js 使用非阻塞策略来执行 I/O 操作,所以客户端使用你的 web 应用是自由的执行任何其他任务,而不必等待数据读/写操作完成。

什么是承诺?

当一个操作完成后返回一个最终值时,它表示一个承诺。 如果我们将承诺作为人类的契约来分析,它将有助于我们从 JavaScript 的角度来理解计算机编程中的承诺概念。 每一个承诺都是两方或多方之间为另一方提供某种价值的协议。 价值可以是有形的,也可以是无形的,但承诺必须提供一些回报。 在承诺实现之前,它一直处于未实现状态。 然而,当作出上述承诺时,就称该承诺已履行。 如果承诺没有如预期的那样兑现,这个承诺就被称为失败。

那么,什么是承诺呢? 根据官方定义:

Promise 是一个具有 then 方法的对象或函数,其行为符合此规范并表示异步操作的最终结果。

这个定义的来源是第 21 页http://www.slideshare.net/wookieb/callbacks-promises-generators-asynchronous-javascript

为什么我们在 JS 中需要承诺?

js 是一个 JavaScript 库,承诺异步 I/O 操作,如对文件的读和写。 当有一个回调方法涉及到所有与 I/O 相关的操作时,它们都是异步的。 这个额外的回调参数混淆了输入和返回值的概念。 它从不与控制流原语一起工作。 它也不处理由回调方法抛出的错误。

因此,我们需要处理由回调方法抛出的错误,但也需要小心不要处理由回调方法抛出的错误。 当我们完成这个时,我们的代码将会是一个混乱的错误处理。

尽管有这么多错误处理代码,我们仍然会遇到额外的回调参数的问题。 promise 帮助您自然地处理错误,并通过不使用回调参数来编写更清晰的代码。

软件必备

开始前第二章,JavaScript 异步模型,你必须需要一组前提概念使用 Promises.js 会让你更好的理解,以及它如何可以节省你的时间和精力在你最近的或即将到来的项目。 下一节将详细说明这些概念是什么,以及我们将如何使用这些概念作为理解承诺的基础。

读这本书的前提是你对过程编程有很好的理解,并且必须具备基本的 JavaScript 知识。 由于本书旨在深入了解一个概念(承诺)及其在不同技术中的使用,因此您必须非常了解 HTML 以及如何根据需要嵌入代码。

对基本编程的理解将帮助您在完成任何一章/一节后,在示例代码的帮助下开始实验。 在这本书中,我试图使每一节都是不言自明的,每一个代码示例都是独立的脚本/程序,达到最大的强度。 然而,在需要的地方,我们添加了一段代码或算法来更清楚地表达我们的观点。

启动前需要的环境

要使用本书中的代码,您不需要任何额外的软件/IDE 来启动。 要对本书提供的代码进行示例,您只需要免费软件/IDE,如 notepad++或任何其他首选的开源 GPL 或 GNU 产品。

此外,要查看代码的结果,您需要一个 web 浏览器,如谷歌的 Chrome 或 Mozilla 的 Firefox。 对于一些与微软技术相关的示例,您将需要 Internet Explorer 9 或更高版本。

未来、承诺和拖延

Future、promise 和 delay 描述了一个对象,该对象作为一个结果的代理,该结果由于其值的计算而最初是未知的,但尚未完成。 在某些并发编程语言中,它们通常被称为用于同步的构造。

Daniel P. Friedman 和 David Wise 在 1975 年提出了“承诺”这个词。 彼得·希巴德(Peter Hibbard)称之为“最终的”。 Liskov 和 Shrira 创造了承诺这个术语,尽管他们用“调用流”来指代管道机制。 承诺一词指的是,在完成任何上述操作后,将获得最终的价值。 以同样的方式,这个值也可以被认为是 final,因为它只会在任何事件发生时产生。 因此,这两个术语同时指代同一事实。

“未来”、“承诺”和“延迟”这三个词经常可以互换使用。 在实施这些术语时存在一些核心差异。 Future 被认为是变量的只读占位符视图,而 promise 是一个可写的单个赋值容器,它设置 Future 的值。

在很多情况下,未来的承诺是共同创造的。 简单地说,未来是一个价值,而承诺是一个设定价值的函数。 future 返回 async 函数的值(promise); 设置 future 的值,也称为解析兑现绑定

承诺流水线

使用 future 可以显著降低分布式系统中的延迟; 例如,promise 在编程语言 E 和 Joule 中支持 promise 流水线,这在 Argus 语言中也被称为call-stream

这里需要记住的一点是,promise 管道应该区别于向支持并行消息传递但不支持管道的系统传递的并行异步消息。 它也不应该与参与者系统中的管道消息处理相混淆,参与者可以在完成当前消息的处理之前指定并开始执行下一条消息的行为。

只读视图

只读视图允许在解析时读取它的值,但不允许您解析它,因此可以获得未来的只读视图。

对只读视图的支持与最小权限原则一致。

只读视图允许您将值限制为需要设置它的主题。 异步消息(带有结果)的发送方接收到结果的只读承诺,消息的目标接收到解析器。

承诺的状态

承诺基于三个状态。 每个状态都有一个重要意义,可以根据需要驱动一定程度的结果。 这可以帮助程序员根据自己的需要进行选择。 承诺的三种状态如下:

  • Pending:这个是一个承诺的初始状态
  • completed:这是一个承诺的状态,表示一个成功的操作
  • Rejected:这是一个承诺的状态,表示操作失败

承诺一旦实现或被拒绝,它是不可变的(也就是说,它永远不会再改变)。

参考前面讨论的概念,现在很清楚承诺是什么,以及如何充分利用它的潜力。

How do we keep Promises.js in this book?

这本书将涵盖 promise. js 的使用,以及实现 promise 概念的每一项主要技术。 这本书被仔细地分成几章来介绍、讨论和解释承诺在特定技术中的使用。 每一章都有一组独立的代码示例,以更好地理解 promise .js 的最佳使用及其结果。

这些示例假设操作系统的选择完全由您自行决定。 根据不同的读者的许可证,它可能会有所不同。

为了更好地理解,所有代码都清晰地打印了说明和注释。 此外,本书还提供了一个软拷贝,列出了在其各自的章节/章节中排序的每一段代码。

浏览器兼容性

promise 支持扩展到许多现代浏览器,但不是所有浏览器。 桌面和移动屏幕分辨率给出了它支持的浏览器的一个方便的参考:

  • Desktop compatibility:

    |

    Function

    |

    Chrome

    |

    Firefox

    |

    Internet Explorer

    |

    opera

    |

    Safari

    | | --- | --- | --- | --- | --- | --- | | Basic support | 36 | 31 | Is not supported until IE11. Add toedge | 27 | 8 |

  • Mobile compatibility:

    |

    Function

    |

    android

    |

    mobile version (Geckos)

    |

    Opera Mobile

    |

    Safari mobile

    |

    Chrome for Android

    | | --- | --- | --- | --- | --- | --- | | Basic support | 4.4.4 | 31 | Edge | Not supported | Not supported | 42 |

小结

在这一章中,我们了解了 JavaScript 的起源,以及它如何成为现代应用开发中的领先技术之一。 我们讨论了为什么在 90 年代早期有对 JavaScript 的需求,以及这种语言在其存在过程中是如何经历起起落落的。

我们也看到了科技公司的投资是如何为创建、开发和发展 JavaScript 做出贡献的,它是动态和快速增长的网络、移动和实时应用市场的主要参与者。

对 promise 概念的适应将使 JavaScript 更加强大,并将帮助开发人员和工程师以一种高效的方式编写更好的代码。

在下一章中,我们将看到什么是异步模型,以及它如何更好地适合于 JavaScript。 这将帮助我们理解在各种语言中采用和实现 promise .js。