1

我是一个项目的新手,并且遇到了一个有趣的设计范例,用于我们对数据库进行的一些异步调用(变量和函数名称已更改):

private void OnLogin(object selectedInitialState,
                     AsyncEventCompletedCallback<EmptyAsyncEventArgs> userCallback,
                     object userState)

示例用法:

OnLogin(
    null,
    args =>
    {
        if (args.IsSuccess)
            DetermineNextStep(); //When done, continue to this step
        else
            //NOTE: This probably means we couldn't connect to the DB
            // Handle this case
    },
    null);

OnLogin(
    newInitialState,
    args =>
    {
         ReLoginUser(); //Was logged in; re-logging in user with different initial state
    },
    null);

示例用法显示了在两种不同情况下对该函数的两次不同调用——初始登录和重新登录(从技术上讲,不是重新登录,而是为当前登录的用户以不同的初始状态重新启动应用程序)。

困扰我的是,这两种情况下的回调函数是不同的。我习惯于看到函数接受回调以允许函数的用户在被调用函数的范围内提供自定义实现。

但是,在上述情况下,回调函数会更改控制流。根据提供的回调函数不同,异步调用返回后的后续调用函数也不同。这是代码异味还是仅仅是回调的创造性用途?

4

1 回答 1

2

我将该OnLogin函数解释为启动一个操作,该操作将在完成后仅调用一次回调。

在这种情况下,代码实际上是很正常的。这在异步编写程序时并不少见。考虑到替代方案是在回调函数中使用(小)状态机保持“状态”,我认为不同的回调实际上是更优雅的解决方案。它隐式而不是显式地处理异步“状态”。

于 2010-07-07T00:38:56.883 回答