@@ -134,9 +134,23 @@ var p2 = new Promise(function(resolve, reject){
134134})
135135``` 
136136
137- 上面代码中,p1和p2都是Promise的实例,但是p2的resolve方法将p1作为参数 ,即一个异步操作的结果是返回另一个异步操作。
137+ 上面代码中,` p1 ` 和 ` p2 ` 都是Promise的实例,但是 ` p2 ` 的 ` resolve ` 方法将 ` p1 ` 作为参数 ,即一个异步操作的结果是返回另一个异步操作。
138138
139- 注意,这时p1的状态就会传递给p2,也就是说,p1的状态决定了p2的状态。如果p1的状态是Pending,那么p2的回调函数就会等待p1的状态改变;如果p1的状态已经是Resolved或者Rejected,那么p2的回调函数将会立刻执行。
139+ 注意,这时` p1 ` 的状态就会传递给` p2 ` ,也就是说,` p1 ` 的状态决定了` p2 ` 的状态。如果` p1 ` 的状态是` Pending ` ,那么` p2 ` 的回调函数就会等待` p1 ` 的状态改变;如果` p1 ` 的状态已经是` Resolved ` 或者` Rejected ` ,那么` p2 ` 的回调函数将会立刻执行。
140+ 
141+ ``` javascript 
142+ var  p1 =  new  Promise (function  (resolve , reject ) {
143+   setTimeout (() =>  reject (new  Error (' fail'  )), 3000 )
144+ })
145+ var  p2 =  new  Promise (function  (resolve , reject ) {
146+   setTimeout (() =>  resolve (p1), 1000 )
147+ })
148+ p2 .then (result  =>  console .log (result))
149+ p2 .catch (error  =>  console .log (error))
150+ //  Error: fail
151+ ``` 
152+ 
153+ 上面代码中,` p1 ` 是一个Promise,3秒之后变为` rejected ` 。` p2 ` 的状态由` p1 ` 决定,1秒之后,` p2 ` 调用` resolve ` 方法,但是此时` p1 ` 的状态还没有改变,因此` p2 ` 的状态也不会变。又过了2秒,` p1 ` 变为` rejected ` ,` p2 ` 也跟着变为` rejected ` 。
140154
141155## Promise.prototype.then()  
142156
@@ -349,19 +363,19 @@ someAsyncThing().then(function() {
349363
350364## Promise.all() 
351365
352- Promise.all方法用于将多个Promise实例 ,包装成一个新的Promise实例。 
366+ ` Promise.all`方法用于将多个Promise实例 ,包装成一个新的Promise实例。
353367
354368```javascript 
355369var p = Promise.all([p1,p2,p3]); 
356370``` 
357371
358- 上面代码中,Promise.all方法接受一个数组作为参数,p1、p2、p3都是Promise对象的实例。( Promise.all方法的参数不一定是数组 ,但是必须具有iterator接口,且返回的每个成员都是Promise实例。) 
372+ 上面代码中,` Promise.all`方法接受一个数组作为参数,`p1`、`p2`、`p3`都是Promise对象的实例,如果不是,就会先调用下面讲到的`Promise.resolve`方法,将参数转为Promise实例,再进一步处理。(` Promise.all`方法的参数不一定是数组 ,但是必须具有iterator接口,且返回的每个成员都是Promise实例。) 
359373
360- p的状态由p1、p2、p3决定 ,分成两种情况。
374+ `p`的状态由`p1`、`p2`、`p3`决定 ,分成两种情况。
361375
362- (1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数 。 
376+ (1)只有`p1`、`p2`、`p3`的状态都变成`fulfilled`,`p`的状态才会变成`fulfilled`,此时`p1`、`p2`、`p3`的返回值组成一个数组,传递给`p`的回调函数 。 
363377
364- (2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数 。 
378+ (2)只要`p1`、`p2`、`p3`之中有一个被`rejected`,`p`的状态就变成`rejected`,此时第一个被`reject`的实例的返回值,会传递给`p`的回调函数 。 
365379
366380下面是一个具体的例子。 
367381
@@ -379,15 +393,30 @@ Promise.all(promises).then(function(posts) {
379393``` 
380394## Promise.race() 
381395
382- Promise.race方法同样是将多个Promise实例 ,包装成一个新的Promise实例。 
396+ ` Promise.race`方法同样是将多个Promise实例 ,包装成一个新的Promise实例。
383397
384398```javascript 
385399var p = Promise.race([p1,p2,p3]); 
386400``` 
387401
388- 上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给p的回调函数。 
402+ 上面代码中,只要`p1`、`p2`、`p3`之中有一个实例率先改变状态,`p`的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给`p`的回调函数。 
403+ 
404+ `Promise.race`方法的参数与`Promise.all`方法一样,如果不是Promise实例,就会先调用下面讲到的`Promise.resolve`方法,将参数转为Promise实例,再进一步处理。 
405+ 
406+ 下面是一个例子,如果指定时间内没有获得结果,就将Promise的状态变为`reject`,否则变为`resolve`。 
407+ 
408+ ```javascript 
409+ var p = Promise.race([ 
410+   fetch('/resource-that-may-take-a-while'), 
411+   new Promise(function (resolve, reject) { 
412+     setTimeout(() => reject(new Error('request timeout')), 5000) 
413+   }) 
414+ ]) 
415+ p.then(response => console.log(response)) 
416+ p.catch(error => console.log(error)) 
417+ ``` 
389418
390- 如果Promise.all方法和Promise.race方法的参数,不是Promise实例,就会先调用下面讲到的Promise.resolve方法,将参数转为Promise实例,再进一步处理 。
419+ 上面代码中,如果5秒之内`fetch`方法无法返回结果,变量`p`的状态就会变为`rejected`,从而触发`catch`方法指定的回调函数 。
391420
392421## Promise.resolve() 
393422
@@ -397,7 +426,15 @@ var p = Promise.race([p1,p2,p3]);
397426var jsPromise = Promise.resolve($.ajax('/whatever.json')); 
398427``` 
399428
400- 上面代码将jQuery生成deferred对象,转为一个新的Promise对象。 
429+ 上面代码将jQuery生成的`deferred`对象,转为一个新的Promise对象。 
430+ 
431+ `Promise.resolve`等价于下面的写法。 
432+ 
433+ ```javascript 
434+ Promise.resolve('foo') 
435+ // 等价于 
436+ new Promise(resolve => resolve('foo')) 
437+ ``` 
401438
402439如果Promise.resolve方法的参数,不是具有then方法的对象(又称thenable对象),则返回一个新的Promise对象,且它的状态为Resolved。 
403440
@@ -428,17 +465,17 @@ p.then(function () {
428465
429466## Promise.reject() 
430467
431- Promise.reject(reason)方法也会返回一个新的Promise实例,该实例的状态为rejected。 Promise.reject方法的参数reason ,会被传递给实例的回调函数。 
468+ ` Promise.reject(reason)` 方法也会返回一个新的Promise实例,该实例的状态为`rejected`。` Promise.reject`方法的参数`reason` ,会被传递给实例的回调函数。
432469
433470```javascript 
434- 
435471var p = Promise.reject('出错了'); 
472+ // 等同于 
473+ var p = new Promise((resolve, reject) => reject('foo')) 
436474
437475p.then(null, function (s){ 
438476  console.log(s) 
439477}); 
440478// 出错了 
441- 
442479``` 
443480
444481上面代码生成一个Promise对象的实例p,状态为rejected,回调函数会立即执行。 
0 commit comments