我正在尝试使用 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/