一般情况下我们都会使用 `new Promise()` 来创建promise对象,但是除此之外我们也可以使用其他方法。
在这里,我们将会学习如何使用 [`Promise.resolve`](http://liubin.github.io/promises-book/#Promise.resolve) 和 [`Promise.reject`](http://liubin.github.io/promises-book/#Promise.reject)这两个方法。
## 2.1.1\. new Promise的快捷方式
静态方法[`Promise.resolve(value)`](http://liubin.github.io/promises-book/#Promise.resolve) 可以认为是 `new Promise()` 方法的快捷方式。
比如 `Promise.resolve(42);` 可以认为是以下代码的语法糖。
~~~
new Promise(function(resolve){
resolve(42);
});
~~~
在这段代码中的 `resolve(42);` 会让这个promise对象立即进入确定(即resolved)状态,并将 `42` 传递给后面then里所指定的 `onFulfilled` 函数。
方法 `Promise.resolve(value);` 的返回值也是一个promise对象,所以我们可以像下面那样接着对其返回值进行 `.then` 调用。
~~~
Promise.resolve(42).then(function(value){
console.log(value);
});
~~~
[Promise.resolve](http://liubin.github.io/promises-book/#Promise.resolve)作为 `new Promise()` 的快捷方式,在进行promise对象的初始化或者编写测试代码的时候都非常方便。
## 2.1.2\. Thenable
`Promise.resolve` 方法另一个作用就是将 [thenable](http://liubin.github.io/promises-book/#Thenable) 对象转换为promise对象。
> [ES6 Promises](http://liubin.github.io/promises-book/#es6-promises)里提到了[Thenable](http://liubin.github.io/promises-book/#Thenable)这个概念,简单来说它就是一个非常类似promise的东西。
就像我们有时称具有 `.length` 方法的非数组对象为Array like一样,thenable指的是一个具有 `.then` 方法的对象。
这种将thenable对象转换为promise对象的机制要求thenable对象所拥有的 `then` 方法应该和Promise所拥有的 `then` 方法具有同样的功能和处理过程,在将thenable对象转换为promise对象的时候,还会巧妙的利用thenable对象原来具有的 `then` 方法。
到底什么样的对象能算是thenable的呢,最简单的例子就是 [jQuery.ajax()](https://api.jquery.com/jQuery.ajax/),它的返回值就是thenable的。
因为`jQuery.ajax()` 的返回值是 [jqXHR Object](http://api.jquery.com/jQuery.ajax/#jqXHR) 对象,这个对象具有 `.then` 方法。
~~~
$.ajax('/json/comment.json');// => 拥有 `.then` 方法的对象
~~~
这个thenable的对象可以使用 `Promise.resolve` 来转换为一个promise对象。
变成了promise对象的话,就能直接使用 `then` 或者 `catch` 等这些在 [ES6 Promises](http://liubin.github.io/promises-book/#es6-promises)里定义的方法了。
将thenable对象转换promise对象
~~~
var promise = Promise.resolve($.ajax('/json/comment.json'));// => promise对象
promise.then(function(value){
console.log(value);
});
~~~
> jQuery和thenable
> [jQuery.ajax()](https://api.jquery.com/jQuery.ajax/)的返回值是一个具有 `.then` 方法的 [jqXHR Object](http://api.jquery.com/jQuery.ajax/#jqXHR)对象,这个对象继承了来自 [Deferred Object](http://api.jquery.com/category/deferred-object/) 的方法和属性。
> 但是Deferred Object并没有遵循[Promises/A+](http://liubin.github.io/promises-book/#promises-aplus)或[ES6 Promises](http://liubin.github.io/promises-book/#es6-promises)标准,所以即使看上去这个对象转换成了一个promise对象,但是会出现缺失部分信息的问题。
> 这个问题的根源在于jQuery的 [Deferred Object](http://api.jquery.com/category/deferred-object/) 的 `then` 方法机制与promise不同。
> 所以我们应该注意,即使一个对象具有 `.then` 方法,也不一定就能作为ES6 Promises对象使用。
> * [JavaScript Promises: There and back again - HTML5 Rocks](http://www.html5rocks.com/en/tutorials/es6/promises/#toc-lib-compatibility)
> * [You're Missing the Point of Promises](http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/)
> * [https://twitter.com/hirano_y_aa/status/398851806383452160](https://twitter.com/hirano_y_aa/status/398851806383452160)
`Promise.resolve` 只使用了共通的方法 `then` ,提供了在不同的类库之间进行promise对象互相转换的功能。
这种转换为thenable的功能在之前是通过使用 `Promise.cast` 来完成的,从它的名字我们也不难想象它的功能是什么。
除了在编写使用Promise的类库等软件时需要对Thenable有所了解之外,通常作为end-user使用的时候,我们可能不会用到此功能。
> 我们会在后面第4章的[Promise.resolve和Thenable](http://liubin.github.io/promises-book/#resolve-thenable)中进行详细的说明,介绍一下结合使用了Thenable和Promise.resolve的具体例子。
简单总结一下 `Promise.resolve` 方法的话,可以认为它的作用就是将传递给它的参数填充(Fulfilled)到promise对象后并返回这个promise对象。
此外,Promise的很多处理内部也是使用了 `Promise.resolve` 算法将值转换为promise对象后再进行处理的。
- 前言
- 第一章 - 什么是Promise
- 1.1. 什么是Promise
- 1.2. Promise简介
- 1.3. 编写Promise代码
- 第二章 - 实战Promise
- 2.1. Promise.resolve
- 2.2. Promise.reject
- 2.3. 专栏: Promise只能进行异步操作?
- 2.4. Promise#then
- 2.5. Promise#catch
- 2.6. 专栏: 每次调用then都会返回一个新创建的promise对象
- 2.7. Promise和数组
- 2.8. Promise.all
- 2.9. Promise.race
- 2.10. then or catch?
- 第三章 - Promise测试
- 3.1. 基本测试
- 3.2. Mocha对Promise的支持
- 3.3. 编写可控测试(controllable tests)
- 第四章 - Advanced
- 4.1. Promise的实现类库(Library)
- 4.2. Promise.resolve和Thenable
- 4.3. 使用reject而不是throw
- 4.4. Deferred和Promise
- 4.5. 使用Promise.race和delay取消XHR请求
- 4.6. 什么是 Promise.prototype.done ?
- 4.7. Promise和方法链(method chain)
- 4.8. 使用Promise进行顺序(sequence)处理
- 第五章 - Promises API Reference
- 5.1. Promise#then
- 5.2. Promise#catch
- 5.3. Promise.resolve
- 5.4. Promise.reject
- 5.5. Promise.all
- 5.6. Promise.race
- 第六章 - 用語集
- 第七章 - 参考网站
- 第八章 - 关于作者
- 第九章 - 关于译者