如何整理嵌套回调
本文关键字:回调 嵌套 何整理 | 更新日期: 2023-09-27 18:02:50
我正在使用Unity的FB SDK,我发现由于异步函数需要按顺序返回而丢失回调,这很麻烦。我如何抽象我的代码,所以这是更干净,从异步回调分离我的逻辑/流?
我的逻辑是:
- 如果玩家没有登录,登录他们(异步)
- 如果他们登录,然后检查他们有正确的权限(Async)
- 如果他们没有正确的权限,请求他们。(异步)
- 一旦他们有"发布分数"的权限,发布分数。(异步)
下面是我想做的一个伪例子:
Init()
{
LogInWithCallback(LoginResponse);
}
public LoginResponse(response)
{
if(response.loggedIn)
{
checkPermissions();
}
}
public checkPermissions(){
checkPermissionsWithCallback(permissionCheckCallback);
}
public permissionCheckCallback(ResponseDelegate)
{
//If the player doesn't have the right permissions, request them.
requestPermissions("score permission",permissionRequestCallback);
}
public permissionRequestCallback()
{
//if requesting the score permission was successful post score;
Postscore(); // <- It doesn't make sense to have logic which posts the player's score this deep down a callback chain, but I don't know any other way around.
}
我之前也遇到过这个问题!
尝试使用承诺。这是一种在javascript中非常流行的编程模式,但c#也可以使用。当然,如果Unity能赶上现代c#,我们也可以使用await之类的东西,但这是不会很快发生的事情。
一方面,它们使代码变得更加容易和直接,但另一方面,它们通常使调试变得更加困难,因为您在匿名委托的崩溃日志中得到的不是可读的方法名,而是类似m_42345的东西。