gpt4 book ai didi

gwt - 解耦 GWT 异步回调

转载 作者:行者123 更新时间:2023-12-04 14:48:04 24 4
gpt4 key购买 nike

我有以下问题:
我正在尝试使用 GWT 对流程进行建模,其中我有几个带有几个提交按钮的 View 。按下 button1 将创建一个服务器交互,如果一切正常,将加载下一个 View 。我的问题是现在我得到了非常讨厌的意大利面代码(只是非常高层次地向您展示我的意思):

onClick {
AsyncCallback {
onSuccess {

load new view with another clickhandler and an asynccallback

}
}
}

有什么方法可以创建某种抽象或其他东西吗?也许是一种状态模式?如何?非常感谢!

最佳答案

这实际上是一个很好的问题——而且可能没有明确的答案。这是一个适用于许多框架的问题,不仅仅是 GWT,所以我喜欢你的想法,用一些简化的代码来看待这个问题。我将把它做的更长一点,以展示即使只有 4 个非常简单的回调看起来像:

嵌套回调

alice.call("a", new Callback() {

@Override
public void onSuccess() {
bob.call("b", new Callback() {

@Override
public void onSuccess() {
charlie.call("c", new Callback() {

@Override
public void onSuccess() {
daisy.call("d", new Callback() {

@Override
public void onSuccess() {
// finished
}

});
}

});
}

});
}

});

命名回调

您可以使用您的 IDE 轻松地将其重构为命名回调(提示:请从下到上阅读回调!):

final Callback daisyCallback = new Callback() {

@Override
public void onSuccess() {
// finished
}
};

final Callback charlieCallback = new Callback() {

@Override
public void onSuccess() {
daisy.call("d", daisyCallback);
}
};

final Callback bobCallback = new Callback() {

@Override
public void onSuccess() {
charlie.call("c", charlieCallback);
}
};

final Callback aliceCallback = new Callback() {

@Override
public void onSuccess() {
bob.call("b", bobCallback);
}
};

alice.call("a", aliceCallback);
  • 问题:控制流不再那么明显了。
  • 尽管如此,IDE 可以通过使用“搜索引用”(Eclipse 中的 Ctrl-G)或类似的东西来提供帮助。

  • 事件总线(或观察者/发布-订阅模式)

    这是使用事件总线的相同调用的样子:

    alice.call("a", new Callback() {

    @Override
    public void onSuccess() {
    bus.fireEvent(BusEvent.ALICE_SUCCESSFUL_EVENT);
    }
    });

    bus.addEventListener(BusEvent.ALICE_SUCCESSFUL_EVENT, new BusEventListener() {

    @Override
    public void onEvent(final BusEvent busEvent) {
    bob.call("b", new Callback() {

    @Override
    public void onSuccess() {
    bus.fireEvent(BusEvent.BOB_SUCCESSFUL_EVENT);
    }
    });

    }
    });

    bus.addEventListener(BusEvent.BOB_SUCCESSFUL_EVENT, new BusEventListener() {

    @Override
    public void onEvent(final BusEvent busEvent) {
    charlie.call("c", new Callback() {

    @Override
    public void onSuccess() {
    bus.fireEvent(BusEvent.CHARLIE_SUCCESSFUL_EVENT);
    }
    });

    }
    });

    bus.addEventListener(BusEvent.CHARLIE_SUCCESSFUL_EVENT, new BusEventListener() {

    @Override
    public void onEvent(final BusEvent busEvent) {
    daisy.call("d", new Callback() {

    @Override
    public void onSuccess() {
    bus.fireEvent(BusEvent.DAISY_SUCCESSFUL_EVENT);
    }
    });

    }
    });

    bus.addEventListener(BusEvent.DAISY_SUCCESSFUL_EVENT, new BusEventListener() {

    @Override
    public void onEvent(final BusEvent busEvent) {
    // finished
    }
    });
  • 在适当的情况下(当每个事件的含义非常清楚时,并且
    如果你没有太多),这种模式可以让事情变得非常好和清晰。
  • 但在其他情况下,它会使控制流更加困惑(并且您很容易获得两倍的代码行)。
  • 使用 IDE 来了解控制流更加困难。
  • GWT 历史机制是合理使用该技术的一个非常积极的例子。

  • 分而治之

    根据我的经验,通过混合嵌套和命名回调来“分而治之”通常是个好主意:

    final Callback charlieCallback = new Callback() {

    @Override
    public void onSuccess() {

    daisy.call("d", new Callback() {

    @Override
    public void onSuccess() {
    // finished
    }
    });
    }
    };

    alice.call("a", new Callback() {

    @Override
    public void onSuccess() {

    bob.call("b", new Callback() {

    @Override
    public void onSuccess() {

    charlie.call("c", charlieCallback);
    }
    });
    }
    });

    根据情况,两个嵌套的回调通常仍然可读,并且它们在读取代码时减少了 50% 的方法之间的跳转。

    (我在这里创建了一个我的例子的粘贴箱,如果你喜欢玩它们: http://pastebin.com/yNc9Cqtb)

    关于gwt - 解耦 GWT 异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11429027/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com