gpt4 book ai didi

javascript - 了解 AMD : how to handle response flow with a one-way module relationship

转载 作者:行者123 更新时间:2023-12-02 16:11:31 24 4
gpt4 key购买 nike

如果您愿意,请考虑一个具有一些独特 View /状态的应用程序 - 让我们将其称为游戏。你有一个主世界屏幕、一个战斗屏幕、一个多人游戏界面,也许还有一两个迷你游戏。

为了便于讨论,每个 View 之间没有太多共同的代码,因此它非常适合 AMD - 中央 Controller /调度程序,并且每个游戏状态分为单独的文件/ View 。

dispatcher.core.js
> overworld.view.js
> battle.view.js
> tournament.view.js
> minigame.view.js

输入和键盘命令被路由到调度程序,并向下渗透到当前事件 View ,后者根据需要操作 DOM。 AMD 的单向关系,到目前为止一切顺利。

我最关心的是响应流程。通过系统的 API 响应数据是多种多样的,通常会同时影响多个 View 。考虑这种情况:

  1. 用户按下按钮进行移动
  2. 按键命令被路由到 map View 以实现移动动画
  3. map 向服务器发送 AJAX 请求以获取移动结果
  4. AJAX 返回“战斗开始”响应给调度员
  5. 调度程序告诉 map View 自行禁用,然后战斗 View 初始化

调度程序就是为此而设计的 - 接收指令并分发。这似乎是显而易见的选择,比让观点直接影响彼此要重要得多。

但是,这里存在一个根本缺陷 - 一旦 AJAX 结果从 View 发送到调度程序,调度程序和 View 之间的单向关系就会被破坏。您可以使用 AJAX 回调的调度程序,也可以指示调度程序为您进行 AJAX 调用 - 但无论哪种方式, View 都需要一种引用调度程序的方法,据我所知,这违反了 AMD 的核心原则。对于我的一生,我无法弄清楚如何正确实现!

我的问题是 - 如何正确实现这样的结构?这是 AMD 的限制,还是我在更深层次上误解了它的用途?

<小时/>

这个问题旨在针对更多的一般情况,但如果它完全影响答案,我将分别使用 Require 和 jQuery for AMD 和 AJAX。

最佳答案

Is this a limitation of AMD, or am I misunderstanding it's use on a deeper level?

AMD 无论如何都不会在对象实例之间强加单向关系。它强烈建议避免什么(因为即使这也不是绝对要求)是模块之间的循环依赖。对于 AMD 来说重要的依赖项类型是加载依赖项。

您当然可以有一个名为 dispatcher 的模块,它可以:

define(function () {
function Dispatcher(views) {
this.views = views;
for (var ix = 0, view; (view = views[ix]); ++ix)
view.init(this);
}

return Dispatcher;
});

以及viewAviewB,其结构如下:

define(function () {
function View() {
// ...
}

View.prototype.init = function (dispatcher) {
this.dispatcher = dispatcher;
};

// Etc...

return View;
});

你的主模块可以做:

define(['dispatcher', 'viewA', 'viewB'], function (Dispatcher, ViewA, ViewB) {

var viewA = new ViewA();
var viewB = new ViewB();

var dispatcher = new Dispatcher([viewA, viewB]);
});

以上只是一个可能的示意性示例,而不是良好设计的处方。无论如何,重点是,就 AMD 而言,在对象之间进行循环引用是完全可行的。

关于javascript - 了解 AMD : how to handle response flow with a one-way module relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30128196/

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