什么是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。等等。这听起来有点复杂,但它实际上很简单。如果你告诉我不能完全理解,我很抱歉。我想我不是最好的人谈论它。

0 0
原创粉丝点击