Skip to content

注意事项 ​

本节目标:理解“注意事项”的核心思路,并能把它用于实际开发或面试表达。

一、状态改变后再拋出错误无效:
如果 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 函数体外抛出的,会冒泡到最外层,成了未捕获的错误。