Appearance
注意事项
本节目标:理解“注意事项”的核心思路,并能把它用于实际开发或面试表达。
一、状态改变后再拋出错误无效:
如果 Promise 状态已经改变,不论是变成resolved还是rejected,再抛出错误是无效的。因为 Promise 的状态一旦改变,就永久保持该状态,不会再变了。
`const` `promise` `=` `new`Promise(function
(resolve,
reject)
`{`reject('fail');
`throw` `new`Error('test'); }); promise
.then(function
(value)
`{`console.log(value)
`})`.catch(function
(error)
`{`console.log(error)
}); // fail 上面代码中,Promise 在reject语句后面,再抛出错误,不会被捕获,等于没有抛出。
二、Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch或then回调的参数语句捕获。 getJSON('/post/1.json').then(function
(post)
`{`
`return`getJSON(post.commentURL); }).then(function
(comments)
`{`
`//` `some`code }).catch(function
(error)
`{`
`//` 处理前面三个`Promise`产生的错误
`});`
上面代码中,一共有三个 Promise 对象:一个由getJSON产生,两个由then产生。它们之中任何一个抛出的错误,都会被最后一个catch捕获。三、Promise内部的错误如果在then结束后再拋出,将不会被捕获。
再看下面的例子。
const promise = new Promise(function (resolve, reject) { resolve('ok'); setTimeout(function () { throw new Error('test') }, 0)});promise.then(function (value) { console.log(value) });// ok// Uncaught Error: test
上面代码中,Promise 指定在下一轮“事件循环”再抛出错误。到了那个时候,Promise 的运行已经结束了,所以这个错误是在 Promise 函数体外抛出的,会冒泡到最外层,成了未捕获的错误。