<commit_before>[[what-is-promise]]
== What Is Promise

首先让我们来了解一下到底什么是Promise呢？

Promise是抽象非同期处理的对象以及对其进行各种操作的组件。
其详细内容在接下来我们还会学到，Promise并不是从JavaScript中发现的概念。

最初被发现是在 http://erights.org/elib/distrib/pipeline.html[E言語]中，
它是基于并列/并行处理设计的一种编程语言。

JavaScript也拥有了这种特性，这就是本书所介绍的JavaScript Promise。

另外，如果说到基于JavaScript的非同期处理，我想大多数都会利用回调函数。

[source,javascript]
使用了回调函数的非同期处理
----
getAsync("fileA.txt", function(error, result){// <1>
    if(error){// 取得失败时的处理
        throw error;
    }
    // 取得成功时的处理
});
----
<1> 回调函数的参数中加入(error对象， 结果)

Node.js等在JavaScript的回调函数的第一个参数里传入 `Error` 对象并以此视为规则的例子也有。

像回调函数的非同期处理一样如果规则统一的话，写法就会很明确。
但是，这也仅是编码规约，即使用不同的写法也不会出错。

Promise，把非同期对象和规则的式样明确，
并规定用统一的接口来写，不可以用除此以外的写法。

[source,javascript]
下面是使用了Promise非同期的一个例子
----
var promise = getAsyncPromise("fileA.txt"); // <1>
promise.then(function(result){
    // 取得成功时的处理
}).catch(function(error){
    // 取得失败时的处理
});
----
<1> 返回promise对象

预设了抽象化非同期处理的promise对象，
可以在这个promise对象处理成功时和失败时执行相应的函数。

我们来简单看一下它和回调函数相比有哪些不同之处，
非同期处理的写法只限定于使用promise对象的接口来写。

也就是说，除promise对象已有的方法(这里的 `then` 或 `catch`)以外都不可以使用，
并不是像回调函数那样在参数可以自由决定，它的做法是固定且统一的。

这样，因Promise统一接口的做法，
就可以形成基于接口的各种各样的非同期处理模式。

所以，promise的功能是可以将复杂的非同期处理轻松的模式化，
这也可以说的上是使用promise的理由之一。<commit_msg>修正了几处错误和不通顺的地方<commit_after>[[what-is-promise]]
== What Is Promise

首先让我们来了解一下到底什么是Promise呢？

Promise是抽象非同期处理的对象以及对其进行各种操作的组件。
Promise并不是从JavaScript中发现的概念，其具体内容接下来我们还会学到。

Promise最初被发现是在 http://erights.org/elib/distrib/pipeline.html[E言語]中，
它是基于并列/并行处理设计的一种编程语言。

现在JavaScript也拥有了这种特性，它就是本书所介绍的JavaScript Promise。

另外，如果说到基于JavaScript的非同期处理，我想大多数都会想到利用回调函数。

[source,javascript]
使用了回调函数的非同期处理
----
getAsync("fileA.txt", function(error, result){// <1>
    if(error){// 取得失败时的处理
        throw error;
    }
    // 取得成功时的处理
});
----
<1> 回调函数的参数中加入(error对象， 结果)

Node.js等在JavaScript的回调函数的第一个参数里传入 `Error` 对象并以此视为规则的例子也有。

像回调函数的非同期处理一样如果规则统一的话，写法就会很明确。
但是，这也仅是编码规约，就算写法不同也不会出错。

Promise，它把非同期对象和使用规则明确化，
并规定用统一的接口来写，不可以使用除此以外的写法。

[source,javascript]
下面是使用了Promise非同期的一个例子
----
var promise = getAsyncPromise("fileA.txt"); // <1>
promise.then(function(result){
    // 取得成功时的处理
}).catch(function(error){
    // 取得失败时的处理
});
----
<1> 返回promise对象

预设了抽象化非同期处理的promise对象后，
就可以在这个promise对象处理成功时和失败时执行相应的函数。

我们来简单看一下它和回调函数相比有哪些不同之处，
非同期处理的写法只限定于使用promise对象的接口来写。

也就是说，除promise对象已有的方法(这里的 `then` 或 `catch`)以外都不可以使用，
并不是像回调函数那样参数可以自由决定，它的做法是固定且统一的。

这样，因Promise统一接口的做法，
就可以形成基于接口的各种各样的非同期处理模式。

所以，promise的功能可以将复杂的非同期处理轻松的模式化，
这也可以说的上是使用promise的理由之一。
{'fraction_non_alphanumeric': 0.1218026796589525, 'fraction_numerical': 0.0032480714575720666, 'mean_word_length': 6.822222222222222, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3937689', 'n_tokens_mistral': 1652, 'n_tokens_neox': 1828, 'n_words': 117}