什么是Promises的重点
来源:互联网 发布:歌词找歌名软件 编辑:程序博客网 时间:2024/03/29 08:12
原文地址
没有翻译完,只翻译了前面一小部分,谈论了什么是Promises,后面都是讲Promises的一些优点。虽然Promises/A是好几年前的规范了,之后还有Promises/A+规范,但是这有助于我们理解抽象思维。
什么是Promises的重点
现在,每一个Javascript开发者甚至他奶奶都听说过Promises,如果你还不知道,那你等下就知道了。promises的理念来自于CommonJs社区的Promises/A规范。Promises通常被用作回调函数异步管理的一种方式,但是因为他们的设计,他们的作用不止如此。实际上,他们的作用会让你惊叹。事实上,由于他们多种使用方式。已经有许多人告诉我–当我写了一些关于一些promises东西后–我遗漏了一些promises的重点。所以到底什么是promises?
关于Promises的一点东西
在我引述promises之前,我想我应该给你看看他们到底是如何工作的。promise是一个对象–来自于Promises/A规范–仅仅包含了一个方法:then。then方法需要传入三个参数(规范中不需要progress方法的实现,但我们很多都实现了):
1. 一个成功后的回调函数(a success callback)
2. 一个失败后的回调函数(a failure callback)
3. 一个过程回调函数 (a progress callback)
并且每次调用then方法后都会返回一个新的promise对象。
一个promise对象可以使三种状态之一:unfulfilled(未实现), fulfilled(已实现), failed(失败)。
如果promise对象成功调用后,会从unfulfilled状态转为fulfilled状态,如果调用失败,会转为failed状态。当promise状态变为fulfilled时,所有的注册到它的成功回调函数会被调用并返回成功的结果值给它。此外,所有的成功回调在注册到promise之后,在它已经被完成之后将被立即调用。
当promise变为失败状态也会发生同样的事,只是被回调的为失败回调而不是成功回调。对于包含progress实现的来说,promise可以在离开未完成状态之前随时更新其progress。当progress更新时,所有过程回调立即被调用并返回一个值。过程回调的处理方式与成功和失败回调的处理方式不同; 如果在进度更新已经发生后注册进度回调,则新进度回调将仅在注册后发生的进度更新被调用。
我们不会深入promise状态是如何被管理的,因为规范中没有,且每个实现方式都不同,在后面的例子中,你可以看到它是如何完成的,但现在这里是所以你需要知道的。
处理回调
处理回调的异步操作,像之前所说的,这是最常使用的promises。让我们来比较一下标准的回调和使用promise。
Callbacks
// 标准的回调用法asyncOperation(function() { // Here's your callback});// 现在异步操作返回一个promiseasyncOperation().then(function(){ // Here's your callback});
让我们看看上面的例子。我怀疑每个人都会关心promises将如何被使用。这看起来可能没有任何益处,除了在asyncOperation完成之后,使用’then’让回调函数回调看起来更明显,显然我们的代码更多了,看起来使用promise比使用标准的回调更逊。
不要让着阻止你。如果promise不能做得更好,这篇文章可能不会存在。
金字塔的末日
你可能在网上发现很多文章引用“金字塔的末日”来作为他们使用promise的主要原因。这是指当我们使用正常的回调,连续执行多个异步操作后,我们会在各个回调之间连续的嵌套调用,创建了一个金字塔(指向右边),因此将promise命名为”金字塔的末日“。如果你只是连续执行两个异步操作这还不是很糟糕,但是一旦你需要三个或者更多,它将变得很难阅读,特别是当你每一步都需要进行体面的处理时,使用promises能够帮助你的代码变得扁平化,并在此变得更加可读。让我们来看看。
Pyramid Of Doom
// Normal callback usage => PYRAMID OF DOOOOOOOOMasyncOperation(function(data){ // Do some processing with `data` anotherAsync(function(data2){ // Some more processing with `data2` yetAnotherAsync(function(){ // Yay we're finished! }); });});// Let's look at using promisesasyncOperation().then(function(data){ // Do some processing with `data` return anotherAsync();}).then(function(data2){ // Some more processing with `data2` return yetAnotherAsync();}).then(function(){ // Yay we're finished!});
你能够看到,使用promises可以让你的代码更加扁平化更具可读性。这很有效,就像之前所说的–then返回一个promise,所以你能够进行链式的调用。
promise通过then方法返回且装载了由回调返回的值。如果回调返回一个promise(就像例子中的情况),then返回的promise装载了与你回调相同的值。这有些口语化,所以我会一步步帮助你理解。
异步操作返回一个promise对象。所以我们调用那个promise对象并传递一个回调函数;then也会返回一个promise。当异步操作完成时,它将给promise装载数据。然后调用回调,并将数据作为参数传递给回调函数。如果回调函数没有返回值,那么当时被then返回的promise将立即被履行没有返回值。如果回调返回的值不是一个promise,那么当时的返回的promise将立即用该值完成。如果返回一个promise(就像例子中的一样),那么被then返回的promise将等待,直到我们的回调返回的promise被完全装载。一旦我们的回调的promise被装载,它装载的值(本例子中的data2)将被提交给then的promise。然后then中 的promise装载date2。等等。这听起来有点复杂,但它实际上很简单。如果你告诉我不能完全理解,我很抱歉。我想我不是最好的人谈论它。
- 什么是Promises的重点
- Promises
- promises与observables的区别
- 浅谈ECMAScript 6下的promises API
- JavaScript中Promises/A+规范的实现
- 六个Async/Await取代Promises的原因
- 基于promise.js实现nodejs的promises库
- 我们在promises的使用上存在问题
- node.js下when.js(Promises/A)的实践
- promises/A+协议的实现模块【q】使用心得
- JavaScript Promises
- JavaScript Promises
- 初识Promises
- 使用Promises
- JavaScript Promises
- javascript Promises
- 【郝斌数据结构自学笔记】26_通过链表排序算法的演示再次详细讨论到底什么是算法以及到底什么是泛型【重点】
- 安装测试的重点
- UE4 设置窗口模式
- 12个免费的 Twitter Bootstrap 后台模板
- 从源代码看 ObjC 中消息的发送
- matlab中fmincon函数的使用
- Error: Error Domain=NSCocoaErrorDomain Code=3000 UserInfo=0x1179f0 "未找到应用程序的“aps-environment”的权利字符
- 什么是Promises的重点
- Gesture Recognizers与触摸事件分发
- AndroidStudio Gradle自定义属性xmlns无法识别
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 根据经纬度定位百度地图(带图片的)
- 微信小程序基本的开发框架抽取,包括网络请求的二次封装,页面状态管理,常见页面模板封装
- VXLAN学习整理
- 第一个 Hibernate应用程序(手动编写)
- C#中操作Word(2)—— 新建、打开、保存和关闭文档