如何消除嵌套回调?

时间:2014-05-11 15:20:30

标签: c# facebook asynchronous callback unity3d

我正在使用FB SDK for Unity,我发现由于需要按顺序返回的异步函数而丢失回调会很麻烦。如何抽象我的代码,以便更清晰,并从异步回调中分离我的逻辑/流程?

我的逻辑是:

  • 如果播放器未登录,请将其登录(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.
 }

1 个答案:

答案 0 :(得分:1)

我前段时间遇到过这个问题!

尝试使用promises。这是一个获得very popular in javascript nowadays的编程模式,但它们也是available for C#。当然,如果Unity能够赶上现代C#,我们也可以使用things like await,但这是不会很快发生的事情。

一方面,他们使代码变得更容易和直接,但另一方面,他们经常使调试更难,因为在匿名代表的崩溃日志中,你得到类似m_42345的东西,而不是可读的方法名称。