@@ -27,7 +27,7 @@ ES6 规定,`Promise`对象是一个构造函数,用来生成`Promise`实例
2727下面代码创造了一个` Promise ` 实例。
2828
2929``` javascript
30- var promise = new Promise (function (resolve , reject ) {
30+ const promise = new Promise (function (resolve , reject ) {
3131 // ... some code
3232
3333 if (/* 异步操作成功 */ ){
@@ -96,7 +96,7 @@ console.log('Hi!');
9696``` javascript
9797function loadImageAsync (url ) {
9898 return new Promise (function (resolve , reject ) {
99- var image = new Image ();
99+ const image = new Image ();
100100
101101 image .onload = function () {
102102 resolve (image);
@@ -116,16 +116,9 @@ function loadImageAsync(url) {
116116下面是一个用` Promise ` 对象实现的 Ajax 操作的例子。
117117
118118``` javascript
119- var getJSON = function (url ) {
120- var promise = new Promise (function (resolve , reject ){
121- var client = new XMLHttpRequest ();
122- client .open (" GET" , url);
123- client .onreadystatechange = handler;
124- client .responseType = " json" ;
125- client .setRequestHeader (" Accept" , " application/json" );
126- client .send ();
127-
128- function handler () {
119+ const getJSON = function (url ) {
120+ const promise = new Promise (function (resolve , reject ){
121+ const handler = function () {
129122 if (this .readyState !== 4 ) {
130123 return ;
131124 }
@@ -135,6 +128,13 @@ var getJSON = function(url) {
135128 reject (new Error (this .statusText ));
136129 }
137130 };
131+ const client = new XMLHttpRequest ();
132+ client .open (" GET" , url);
133+ client .onreadystatechange = handler;
134+ client .responseType = " json" ;
135+ client .setRequestHeader (" Accept" , " application/json" );
136+ client .send ();
137+
138138 });
139139
140140 return promise;
@@ -152,11 +152,11 @@ getJSON("/posts.json").then(function(json) {
152152如果调用` resolve ` 函数和` reject ` 函数时带有参数,那么它们的参数会被传递给回调函数。` reject ` 函数的参数通常是` Error ` 对象的实例,表示抛出的错误;` resolve ` 函数的参数除了正常的值以外,还可能是另一个 Promise 实例,比如像下面这样。
153153
154154``` javascript
155- var p1 = new Promise (function (resolve , reject ) {
155+ const p1 = new Promise (function (resolve , reject ) {
156156 // ...
157157});
158158
159- var p2 = new Promise (function (resolve , reject ) {
159+ const p2 = new Promise (function (resolve , reject ) {
160160 // ...
161161 resolve (p1);
162162})
@@ -167,11 +167,11 @@ var p2 = new Promise(function (resolve, reject) {
167167注意,这时` p1 ` 的状态就会传递给` p2 ` ,也就是说,` p1 ` 的状态决定了` p2 ` 的状态。如果` p1 ` 的状态是` pending ` ,那么` p2 ` 的回调函数就会等待` p1 ` 的状态改变;如果` p1 ` 的状态已经是` resolved ` 或者` rejected ` ,那么` p2 ` 的回调函数将会立刻执行。
168168
169169``` javascript
170- var p1 = new Promise (function (resolve , reject ) {
170+ const p1 = new Promise (function (resolve , reject ) {
171171 setTimeout (() => reject (new Error (' fail' )), 3000 )
172172})
173173
174- var p2 = new Promise (function (resolve , reject ) {
174+ const p2 = new Promise (function (resolve , reject ) {
175175 setTimeout (() => resolve (p1), 1000 )
176176})
177177
@@ -276,7 +276,7 @@ p.then((val) => console.log('fulfilled:', val))
276276下面是一个例子。
277277
278278``` javascript
279- var promise = new Promise (function (resolve , reject ) {
279+ const promise = new Promise (function (resolve , reject ) {
280280 throw new Error (' test' );
281281});
282282promise .catch (function (error ) {
@@ -289,7 +289,7 @@ promise.catch(function(error) {
289289
290290``` javascript
291291// 写法一
292- var promise = new Promise (function (resolve , reject ) {
292+ const promise = new Promise (function (resolve , reject ) {
293293 try {
294294 throw new Error (' test' );
295295 } catch (e) {
@@ -301,7 +301,7 @@ promise.catch(function(error) {
301301});
302302
303303// 写法二
304- var promise = new Promise (function (resolve , reject ) {
304+ const promise = new Promise (function (resolve , reject ) {
305305 reject (new Error (' test' ));
306306});
307307promise .catch (function (error ) {
@@ -314,7 +314,7 @@ promise.catch(function(error) {
314314如果Promise状态已经变成` resolved ` ,再抛出错误是无效的。
315315
316316``` javascript
317- var promise = new Promise (function (resolve , reject ) {
317+ const promise = new Promise (function (resolve , reject ) {
318318 resolve (' ok' );
319319 throw new Error (' test' );
320320});
@@ -399,7 +399,7 @@ process.on('unhandledRejection', function (err, p) {
399399再看下面的例子。
400400
401401``` javascript
402- var promise = new Promise (function (resolve , reject ) {
402+ const promise = new Promise (function (resolve , reject ) {
403403 resolve (' ok' );
404404 setTimeout (function () { throw new Error (' test' ) }, 0 )
405405});
@@ -413,7 +413,7 @@ promise.then(function (value) { console.log(value) });
413413一般总是建议,Promise 对象后面要跟` catch ` 方法,这样可以处理 Promise 内部发生的错误。` catch ` 方法返回的还是一个 Promise 对象,因此后面还可以接着调用` then ` 方法。
414414
415415``` javascript
416- var someAsyncThing = function () {
416+ const someAsyncThing = function () {
417417 return new Promise (function (resolve , reject ) {
418418 // 下面一行会报错,因为x没有声明
419419 resolve (x + 2 );
@@ -449,7 +449,7 @@ Promise.resolve()
449449` catch ` 方法之中,还能再抛出错误。
450450
451451``` javascript
452- var someAsyncThing = function () {
452+ const someAsyncThing = function () {
453453 return new Promise (function (resolve , reject ) {
454454 // 下面一行会报错,因为x没有声明
455455 resolve (x + 2 );
@@ -491,7 +491,7 @@ someAsyncThing().then(function() {
491491` Promise.all ` 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
492492
493493``` javascript
494- var p = Promise .all ([p1, p2, p3]);
494+ const p = Promise .all ([p1, p2, p3]);
495495```
496496
497497上面代码中,` Promise.all ` 方法接受一个数组作为参数,` p1 ` 、` p2 ` 、` p3 ` 都是 Promise 实例,如果不是,就会先调用下面讲到的` Promise.resolve ` 方法,将参数转为 Promise 实例,再进一步处理。(` Promise.all ` 方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。)
@@ -506,7 +506,7 @@ var p = Promise.all([p1, p2, p3]);
506506
507507``` javascript
508508// 生成一个Promise对象的数组
509- var promises = [2 , 3 , 5 , 7 , 11 , 13 ].map (function (id ) {
509+ const promises = [2 , 3 , 5 , 7 , 11 , 13 ].map (function (id ) {
510510 return getJSON (' /post/' + id + " .json" );
511511});
512512
@@ -586,7 +586,7 @@ Promise.all([p1, p2])
586586` Promise.race ` 方法同样是将多个Promise实例,包装成一个新的Promise实例。
587587
588588``` javascript
589- var p = Promise .race ([p1, p2, p3]);
589+ const p = Promise .race ([p1, p2, p3]);
590590```
591591
592592上面代码中,只要` p1 ` 、` p2 ` 、` p3 ` 之中有一个实例率先改变状态,` p ` 的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给` p ` 的回调函数。
@@ -613,7 +613,7 @@ p.catch(error => console.log(error));
613613有时需要将现有对象转为Promise对象,` Promise.resolve ` 方法就起到这个作用。
614614
615615``` javascript
616- var jsPromise = Promise .resolve ($ .ajax (' /whatever.json' ));
616+ const jsPromise = Promise .resolve ($ .ajax (' /whatever.json' ));
617617```
618618
619619上面代码将jQuery生成的` deferred ` 对象,转为一个新的Promise对象。
@@ -666,7 +666,7 @@ p1.then(function(value) {
666666如果参数是一个原始值,或者是一个不具有` then ` 方法的对象,则` Promise.resolve ` 方法返回一个新的Promise对象,状态为` resolved ` 。
667667
668668``` javascript
669- var p = Promise .resolve (' Hello' );
669+ const p = Promise .resolve (' Hello' );
670670
671671p .then (function (s ){
672672 console .log (s)
@@ -683,7 +683,7 @@ p.then(function (s){
683683所以,如果希望得到一个Promise对象,比较方便的方法就是直接调用` Promise.resolve ` 方法。
684684
685685``` javascript
686- var p = Promise .resolve ();
686+ const p = Promise .resolve ();
687687
688688p .then (function () {
689689 // ...
@@ -717,9 +717,9 @@ console.log('one');
717717` Promise.reject(reason) ` 方法也会返回一个新的 Promise 实例,该实例的状态为` rejected ` 。
718718
719719``` javascript
720- var p = Promise .reject (' 出错了' );
720+ const p = Promise .reject (' 出错了' );
721721// 等同于
722- var p = new Promise ((resolve , reject ) => reject (' 出错了' ))
722+ const p = new Promise ((resolve , reject ) => reject (' 出错了' ))
723723
724724p .then (null , function (s ) {
725725 console .log (s)
@@ -814,7 +814,7 @@ Promise.prototype.finally = function (callback) {
814814``` javascript
815815const preloadImage = function (path ) {
816816 return new Promise (function (resolve , reject ) {
817- var image = new Image ();
817+ const image = new Image ();
818818 image .onload = resolve;
819819 image .onerror = reject;
820820 image .src = path;
@@ -833,17 +833,17 @@ function getFoo () {
833833 });
834834}
835835
836- var g = function * () {
836+ const g = function * () {
837837 try {
838- var foo = yield getFoo ();
838+ const foo = yield getFoo ();
839839 console .log (foo);
840840 } catch (e) {
841841 console .log (e);
842842 }
843843};
844844
845845function run (generator ) {
846- var it = generator ();
846+ const it = generator ();
847847
848848 function go (result ) {
849849 if (result .done ) return result .value ;
0 commit comments