[英]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.