如何整理嵌套回调

本文关键字:回调 嵌套 何整理 | 更新日期: 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的东西。