promise.then

promise.then返回的是一個新的 promise 對象

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

爲何返回的是這個呢?
由於 resolveundefined,把它當作一個函數去調用固然會報錯,因此就算沒有 return 任何東西,此時的 then 返回的 promiserejected。並且,通常不能在 Promise.then()中調用 resolvereject,除非你這樣寫: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 將會變成 resolvedvalue 便是 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'),那這個 Promiseresolvedvalue 便是 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 就是接收狀態,valueundefined,以下例。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

使用 awaitcatch 中可捕獲 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
相關文章
相關標籤/搜索