有一组代表类似OOP类的JS模块:想到例如不同类型的后端任务(SendEmailTask
,WriteToDbTask
,WriteToDiskTask
),或绘图画布上的不同操作(DrawArc
,DrawLine
,DrawBezier
)。这只是一些例子。
每个文件都是一个JS文件,它有自己的define
,它们都位于一个公共目录中。在依赖于所有这些的客户端模块中,依赖性列表和参数列表必须分别包括这些中的每一个,例如,类似的东西:
define([
'tasks/sendEmailTask', 'tasks/writeToDbTask', 'tasks/writeToDiskTask', ...
], function (SendEmailTask, WriteToDbTask, WriteToDiskTask, ...) {
/* ... */
/* ... new SendEmailTask(); */
/* ... new WriteToDbTask(); */
/* ... new WriteToDiskTask(); */
});
并且每次将新模块添加到集合时都必须更新它们,例如MakeCoffeeTask
,在我看来是BadThing™。
有没有办法避免这些最后的问题?我想到了几种可能的方法,但我不知道如何让它们发挥作用:
'tasks/*'
表示依赖项和<不知道> 的参数。答案 0 :(得分:0)
您可以为每个部分制作不同的模块。例如:'tasks / main' 在Task main中,您可以包含所需的所有文件。在任务主体中,将分配任务的所有功能。并且你调用高级功能。看看:
define(['tasks/main'], function(task){
task.add('Project Status meeting');
task.SendEmailNotification('tAll');
});
在task / main.js中:
define(['tasks/sendEmailTask', 'tasks/writeToDbTask', 'tasks/writeToDiskTask',], function(sendEmailTask, writeToDbTask, writeToDiskTask){
var task = {
add = function(taskObj){
// write your code using writeToDbTask, writeToDiskTask
},
SendEmailNotification = function(whom){
// write your code using sendEmailTask, writeToDbTask, writeToDiskTask
};
return task;
});
对你有帮助吗?
答案 1 :(得分:0)
我无法找到任何其他解决方案。这就是我在此期间提出的......这只是对当前形势的一种改进,但我认为它不能解决所提出的问题。
// in tasks/taskNamespace.js or in any client code
define (function(require) {
var _taskArray = [
require('tasks/sendEmailTask'),
require('tasks/writeToDbTask'),
require('tasks/writeToDiskTask'),
/* ... , */
];
var TaskNamespace = {};
_taskArray.forEach(function (taskClass) {
TaskNamespace[taskClass.name] = taskClass;
});
return TaskNamespace;
});
它利用了RequireJS Sugar语法和JS Function.name即将推出的新功能,在ES6中提出。
最终结果是什么?您仍然需要手动将每个 Class 添加到列表中,但它只是一个列表而不是两个。 WHOA