我有兩個函數可以處理Facebook登錄/註銷,前兩個函數都是用promise寫的。我想用async/await
來重寫這些。用異步/等待重寫承諾,尋求澄清
原代碼與承諾:
export function login() {
return new Promise<facebookSdk.IAuthResponse>((resolve, reject) => {
FB.login((response) => {
if (response.authResponse) {
resolve(response)
} else {
reject(errors.facebookLoginError)
}
})
})
}
export function logout() {
return new Promise<facebookSdk.IAuthResponse>((resolve) => {
FB.logout((response) => {
resolve(response)
})
})
}
以下是我寫了他們使用async/await
:
function promiseFacebookLogin(): Promise<facebookSdk.IAuthResponse | Error> {
return new Promise<facebookSdk.IAuthResponse>((resolve, reject) => {
FB.login((response) => {
if (response.authResponse) {
resolve(response)
} else {
reject(errors.facebookLoginError)
}
})
})
}
export async function login(): Promise<facebookSdk.IAuthResponse | Error> {
try {
return await promiseFacebookLogin()
} catch (err) {
throw err
}
}
export async function logout(): Promise<facebookSdk.IAuthResponse | void> {
try {
return await FB.logout((response) => {
return response
})
} catch (err) {
throw err
}
}
生成的代碼按預期工作,但有件事情我想澄清一下。正如你所看到的,我可以擺脫logout
函數的全部promise語法。但是,當涉及到login
函數時,我無法這樣做。我必須分開承諾,等待結果。據我研究,這似乎是回調函數的常見做法。
有人可以闡明爲什麼在login
函數中不能完全擺脫Promise語法?
難道你沒有寫你的'登錄'方法[像這樣](https://jsfiddle.net/uuzoufzd/)來消除承諾?我不確定這是否有效。 – Saravana
這是FB.login的簽名:'login(callback:(response:IAuthResponse)=> void):void' 我不能在沒有回調的情況下調用它。 – cinnaroll45
想'FB.login'會通過查看'FB.logout'返回一個承諾。如果'FB.logout'沒有返回promise,你怎麼能從'logout'方法返回任何東西?它不會總是返回'空白'嗎? – Saravana