一、若是 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