Javascript、构建器模式和回调

标签 javascript node.js

我正在尝试使用 Node.js 为我处理一些可编写脚本的 URL 重定向。它工作得很好,但脚本需要采用尽可能简单的格式,因为它将由其他人管理。

我想做的是使用构建器模式,这样我就可以拥有以下内容:

redirectWhen.isMobileDevice().urlMatches("http://www.somewhere.com").thenGoTo("http://mobile.somewhere.com");
redirectWhen.urlMatches("http://subdomain.somewhere.com").thenGoTo("http://www.somewhere.com/somefolder/");

然后我会根据结果进行重定向(基本上匹配链中所有项目的最后一个获胜)。如果您想象所有函数(isMobileDevice() & urlMatches(...) 都执行一些简单的字符串检查,仅此而已,那么一切正常。

但我需要 isMobileDevice() 函数来执行 HTTP 请求。这意味着有一个在响应完成时被调用的回调函数。是否有可能做到这一点并且仍然保持构建器模式完好无损?我想我可以做类似的事情:

redirectWhen.isMobileDevice(function() {
  urlMatches("...").thenGoTo("...");
});

但这给脚本增加了比我想要的更多的复杂性。将管理这些脚本的人员了解基本的 JavaScript,但如果他们必须开始嵌套回调,我想他们很快就会感到困惑。

我猜我正在尝试实现这里不可能实现的目标,但我自己对 JS 的了解还不够多,无法证实这一点!

最佳答案

您不必为了使其异步工作而放弃优雅的构建模式。您可以制作一个 Node 链表,每个 Node 在成功时调用下一个 Node 。

我设置了一个 fiddle使用 Chain 和多个 ChainNode 实现。一些注意事项:

  • 每个 ChainNode 都有一个 execute() 方法和一个需要使用 next() 调用的 nextNode > 当它完成自己的处理时。例如,只有当 URL 与模式匹配时,URL 模式匹配器才会调用下一个 Node ,否则它只会返回(打破执行链)。
  • IsMobileNode 可以通过从某个异步调用(例如 AJAX)的回调调用 next() 来实现。在 fiddle 中,一个简单的 setTimeout 演示了这个概念。
  • Chain 有一个head 指示开始执行的位置,还有一个tail 用于附加新 Node 。 chain(nextNode) 方法确保链保持完整。
  • urlMatches(urlPattern)isMobileDevice() 方法只是创建一个 Node 并将其附加到链中。
  • thenGoTo() 方法链接最终 Node 以启动重定向。然后,它从 head 开始执行链。

关于Javascript、构建器模式和回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14477586/

相关文章:

javascript - 当页面滚动到某个点时,如何使用 jQuery 更改文本?

node.js - 如何从 Node.js 中的错误中获取行名和文件名?

javascript - node.js - 如何从一个网址链接下载许多图像

node.js - Node js删除目录中的旧文件

node.js - Nodemailer XOauth2 [错误 : unauthorized_client] when trying to get new access token

javascript - 在模板 angular 2 中访问 javascript var

javascript - 如何从Firebug的控制台访问Firebug的信息?

javascript - 从 JavaScript 中的文本文件加载数组声明

javascript - 如何在 Alert 函数 [React-Native] 上从 onPress 调用方法

node.js - 如何在nodejs中将模型返回结果到 Controller