一、若是 then()
方法中抛出了一个异常,那么返回的 Promise
将会变成拒绝状态,value
是异常的 reason,以下例。promise
new Promise((resolve, reject) => { if (true) { resolve(); } else { reject(); } }).then((data) => { resolve(); }, (error) => { reject(); }) then 返回的 promise: { [[promiseStatus]]: 'rejected', [[promiseValue]]: 'ReferenceError: resolve is not defined at Promise.then' }
为何返回的是这个呢?
由于 resolve
是 undefined
,把它当作一个函数去调用固然会报错,因此就算没有 return
任何东西,此时的 then
返回的 promise
是 rejected
。并且,通常不能在 Promise.then()
中调用 resolve
和 reject
,除非你这样写:async
new Promise((resolve, reject) => { if (true) { resolve(resolve); // 将 resolve 传递下去 } else { reject(); } }).then((data) => { data(); // data 接收了 resolve 函数 })
在 then()
方法中抛出了一个异常函数
var promise2 = new Promise(function(resolve, reject) { setTimeout(function() { resolve('success'); }, 2000); }); promise2.then(function(data) { throw new Error('irene') }) then 返回的 promise: { [[PromiseStatus]]: "rejected" [[PromiseValue]]: "Error: irene" }
二、若是 then()
方法中 return
【普通】参数值,那么返回的 Promise
将会变成 resolved
,value
便是 return
的那个数据,以下例。线程
var promise2 = new Promise(function(resolve, reject) { setTimeout(function() { resolve('success'); }, 2000); }); promise2.then(function(data) { return 2 }) then 返回的 promise: { [[PromiseStatus]]: "resolved" [[PromiseValue]]: 2 }
三、若是 then()
方法中 return Promise
,那这个 Promise
是什么状态,then
返回的就是什么状态,以下例。code
var promise2 = new Promise(function(resolve, reject) { setTimeout(function() { resolve('success'); }, 2000); }); promise2.then(function(data) { return new Promise(function(resolve, reject) { // 注意必定要写 return,不然就属于第4种状况了 reject('把状态置为rejected error'); }); }) then 返回的 promise: { [[PromiseStatus]]: "rejected" [[PromiseValue]]: "把状态置为rejected error" }
四、若是 then()
方法中 return new Error('irene')
,那这个 Promise
是 resolved
,value
便是 new Error('irene')
,以下例。对象
new Promise((resolve, reject) => { if (true) { resolve(); } else { reject(); } }).then(() => { return new Error('irene') }) then 返回的 promise: { [[promiseStatus]]: 'resolved', [[promiseValue]]: Error: irene }
五、若是 then()
方法中没有 return
任何东西,那么返回的 Promise
就是接收状态,value
是 undefined
,以下例。it
new Promise((resolve, reject) => { if (true) { resolve(); } else { reject(); } }).then(() => { console.log('resolve') }) then 返回的 promise: { [[promiseStatus]]: 'resolved', [[promiseValue]]: undefined }
六、try-catch
没法捕获 then()
中抛出的错误。由于先执行主线程代码,没有报错,因此 catch
不会打印;再执行微任务,也就是 then()
中的代码,此时报了错,因为主线程代码已经执行结束,因此不会 catch then()
中的报错。可使用 await
解决这个问题。io
try { new Promise((resolve, reject) => { if (true) { resolve(); } else { reject(); } }).then(() => { throw new Error('irene') }) } catch (err) { console.log(err) // 因为没法捕获,因此此处的没法打印 } Uncaught (in promise) Error: irene at <anonymous>:9:11
使用 await
,catch
中可捕获 then()
中抛出来的错误信息console
try { var a = await new Promise((resolve, reject) => { if (true) { resolve(); } else { reject(); } }).then(() => { throw new Error('irene') }) } catch (err) { console.log(err) } // catch 中打印出来的信息,此时 a 是 undefined。 Error: irene at <anonymous>:9:11 at async <anonymous>:2