【发布时间】:2017-10-29 19:12:46
【问题描述】:
我的前端有两个处理 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 语法吗?
【问题讨论】:
-
你不能写你的
login方法like this来消除承诺吗?我不确定这是否有效。 -
这是 FB.login 的签名:
login(callback: (response: IAuthResponse) => void): void没有回调我不能调用它。 -
认为
FB.login会通过查看FB.logout来返回一个承诺。如果FB.logout没有返回承诺,你怎么能从logout方法返回任何东西?它不会总是返回void吗? -
好点,它确实返回
void,但它按预期完成了logout操作。 -
这可能是真的,因为您没有使用您的承诺返回的值,因为您的
logout方法将在您的回调执行之前返回。如果你需要回调中的值,那么你也必须用一个 Promise 包装FB.logout。
标签: javascript typescript async-await es6-promise facebook-sdk-4.x