diff --git a/docs/async.md b/docs/async.md index de79809..44f0e29 100644 --- a/docs/async.md +++ b/docs/async.md @@ -892,6 +892,23 @@ f() // hello world ``` +如果有多个`await`命令,可以统一放在`try...catch`结构中。 + +```javascript +async function main() { + try { + var val1 = await firstStep(); + var val2 = await secondStep(val1); + var val3 = await thirdStep(val1, val2); + + console.log('Final: ', val3); + } + catch (err) { + console.error(err); + } +} +``` + (4)如果`await`后面的异步操作出错,那么等同于`async`函数返回的Promise对象被`reject`。 ```javascript @@ -1042,7 +1059,8 @@ async function myFunction() { // 另一种写法 async function myFunction() { - await somethingThatReturnsAPromise().catch(function (err){ + await somethingThatReturnsAPromise() + .catch(function (err) { console.log(err); }; } diff --git a/docs/promise.md b/docs/promise.md index c468a14..7d4fec2 100644 --- a/docs/promise.md +++ b/docs/promise.md @@ -40,7 +40,7 @@ Promise构造函数接受一个函数作为参数,该函数的两个参数分 `resolve`函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;`reject`函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从Pending变为Rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。 -Promise实例生成以后,可以用then方法分别指定Resolved状态和Reject状态的回调函数。 +Promise实例生成以后,可以用`then`方法分别指定`Resolved`状态和`Reject`状态的回调函数。 ```javascript promise.then(function(value) { @@ -109,6 +109,8 @@ function loadImageAsync(url) { } ``` +上面代码中,使用Promise包装了一个图片加载的异步操作。如果加载成功,就调用`resolve`方法,否则就调用`reject`方法。 + 下面是一个用Promise对象实现的Ajax操作的例子。 ```javascript @@ -148,11 +150,11 @@ getJSON("/posts.json").then(function(json) { 如果调用`resolve`函数和`reject`函数时带有参数,那么它们的参数会被传递给回调函数。`reject`函数的参数通常是Error对象的实例,表示抛出的错误;`resolve`函数的参数除了正常的值以外,还可能是另一个Promise实例,表示异步操作的结果有可能是一个值,也有可能是另一个异步操作,比如像下面这样。 ```javascript -var p1 = new Promise(function(resolve, reject){ +var p1 = new Promise(function (resolve, reject) { // ... }); -var p2 = new Promise(function(resolve, reject){ +var p2 = new Promise(function (resolve, reject) { // ... resolve(p1); }) @@ -611,6 +613,26 @@ p.then(function () { 上面代码的变量`p`就是一个Promise对象。 +需要注意的是,立即`resolve`的Promise对象,是在本轮“事件循环”(event loop)的结束时,而不是在下一轮“事件循环”的开始时。 + +```javascript +setTimeout(function () { + console.log('three'); +}, 0); + +Promise.resolve().then(function () { + console.log('two'); +}); + +console.log('one'); + +// one +// two +// three +``` + +上面代码中,`setTimeout(fn, 0)`在下一轮“事件循环”开始时执行,`Promise.resolve()`在本轮“事件循环”结束时执行,`console.log(’one‘)`则是立即执行,因此最先输出。 + ## Promise.reject() `Promise.reject(reason)`方法也会返回一个新的Promise实例,该实例的状态为`rejected`。它的参数用法与`Promise.resolve`方法完全一致。