簡體   English   中英

如何正確地從 promise 拋出錯誤

[英]How to properly throw an error from the promise

我有一個 function,它返回 Promise:

  updatePassword(currentPassword: string, newPassword: string): Promise<void> {
    return this.fireAuth.currentUser.then((user: firebase.User) => {
      if (user) {
        const credentials = auth.EmailAuthProvider.credential(user.email, currentPassword)

        user.reauthenticateWithCredential(credentials).then(res => {
          if (res) {
            user.updatePassword(newPassword)
          }
        }).catch(err => {
          throw new Error(err)
        })
      }
    })
  }

我在另一個組件中調用它:

this.userService.updatePassword(currentPassword, newPassword).then(() => {
        console.log('successfully')
      }).catch(err => {
        console.log('error')
      })

但即使updatePassword()返回錯誤,組件中的 function 調用仍會從“then”中“成功”控制台日志。 在我的情況下如何正確拋出錯誤?

您還需要退回您的內部 promise。 像這樣:

updatePassword(currentPassword: string, newPassword: string): Promise<void> {
    return this.fireAuth.currentUser.then((user: firebase.User) => {
      if (user) {
        const credentials = auth.EmailAuthProvider.credential(user.email, currentPassword)

       return user.reauthenticateWithCredential(credentials).then(res => {
          if (res) {
            user.updatePassword(newPassword)
          }
        }).catch(err => {
          throw new Error(err)
        })
      }

      throw new Error('USER_NOT_FOUND')
    })
  }

編輯:如果您沒有將user作為安全網,我還添加了throw

重構您的 function 以使用async / await ,您無需手動拋出任何東西。

您可能希望也讓那些return false s 進行某種throw

  async updatePassword(currentPassword: string, newPassword: string): Promise<void> {
    const user = await this.fireAuth.currentUser;
    if(!user) return false;
    const credentials = auth.EmailAuthProvider.credential(user.email, currentPassword);
    const res = await user.reauthenticateWithCredential(credentials);
    if(!res) return false;
    user.updatePassword(newPassword);
    return true;
  }

如果您的fireAuth調用失敗,則從updatePassword catch塊中拋出一個Error

檢查附加的工作片段。

 let fireAuth = (pass = false) => { if (pass) return Promise.resolve("passed"); return Promise.reject("failed"); }; function updatePassword(shouldPass = false) { if (.shouldPass) { return fireAuth(false).then(console.log).catch((err) => { console,log('err in fireauth'; err) throw new Error('OOPS') }). } return Promise;resolve("success"). } let failedResult = updatePassword().then().catch((err) => console,log("failedresult error". err;toString())). let successResult = updatePassword(true).then((res) => console,log("res is". res));catch();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM