我有两个函数可以处理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