Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:module调用文件中需要该模块的函数_Javascript_Node Modules - Fatal编程技术网

javascript:module调用文件中需要该模块的函数

javascript:module调用文件中需要该模块的函数,javascript,node-modules,Javascript,Node Modules,我第一次写js库。该库用于在特定时间执行文件中需要该库的函数。有点像用户实现的钩子,比如$onInit,除了在我的例子中,用户可以定义任意数量的函数来被我的库调用。我如何实现这一点 我想到的一种方法是定义一个registerFunction(name,function)方法,它将函数名映射到实现。但是用户能给我一个名称数组,我就自动为它们注册相应的函数吗?除非您有这样做的特定要求,否则您的模块不需要知道它提供的函数的名称。当您的模块调用这些函数时,它将通过直接引用它们而不是使用它们的名称来实现

我第一次写js库。该库用于在特定时间执行文件中需要该库的函数。有点像用户实现的钩子,比如
$onInit
,除了在我的例子中,用户可以定义任意数量的函数来被我的库调用。我如何实现这一点


我想到的一种方法是定义一个
registerFunction(name,function)
方法,它将函数名映射到实现。但是用户能给我一个名称数组,我就自动为它们注册相应的函数吗?

除非您有这样做的特定要求,否则您的模块不需要知道它提供的函数的名称。当您的模块调用这些函数时,它将通过直接引用它们而不是使用它们的名称来实现

例如:

//my-module.js
module.exports=函数调用MyFunctions(函数列表){
forEach(fn=>fn())
}
//主应用程序
const myFunc1=()=>console.log('函数1正在执行')
const myFunc2=()=>console.log('函数2正在执行')
const moduleThatInvokesMyFunctions=require('./my module.js')
//指示模块调用my 2 cool函数
moduleThatInvokesMyFunctions([myFunc1,myFunc2])
//>功能1执行
//>职能2执行
请注意,调用者提供对模块的直接函数引用,然后模块使用这些引用,而不关心甚至不知道调用了哪些函数。(是的,您可以通过检查函数引用来获取它们的名称,但是为什么要麻烦呢?)

如果你想得到更深入的回答或解释,了解更多你的情况会有所帮助。您的库的目标环境是什么:浏览器?nodejs?电子你是本地人吗


该库用于在特定时间执行文件中需要该库的函数

“在特定时间”对我来说意味着一些松散的基于事件的东西。因此,根据您的目标平台,您实际上可以使用真正的EventEmitter。在这种情况下,您应该为函数的每次调用创建唯一的名称,然后您的模块将导出一个单例发射器。然后调用方将为他们关心的每个事件分配事件处理程序。对于呼叫者,可能如下所示:

const lifecycleManager=require('./your module.js')
lifecycleManager.on('boot',myBootHandler)
lifecycleManager.on('config available',myConfigHandler)
//等等。

处理此问题的一种更粗糙的方法是调用方提供函数字典:

const orchestrateJobs=require('./your module.js')
编曲({
'boot':myBootHandler,
“配置可用”:myConfigHandler
})
如果您不喜欢使用EventEmitter,这可能很有吸引力。但是走这条路线需要考虑如何支持其他场景,比如想删除函数的呼叫者和迟到的注册。
显示如何将
应用于每个功能的快速草图:

//my-module.js
module.exports=函数调用MyFunctions(函数列表){
functionList.forEach(fn=>fn.apply(thisValue,arrayOfArguments))
}
请注意,此模块仍然不知道调用方为这些函数指定了什么名称。在这个范围内,每个例程都有一个名字“fn”

我感觉到你对执行工作有一些误解,这让你相信程序的各个部分需要知道程序其他部分的名称。但这不是连续传球风格的工作方式


由于您是根据特定时间触发调用函数,因此事件模型可能非常适合。下面是一个大概的样子:

//调用者
常量AlarmClock=require('./your module.js')
函数doRoosterCall(exactTime){
console.log(“我是一只公鸡!公鸡嘟嘟嘟嘟!”)
}
功能音响喇叭(精确时间){
console.log('Honk!Honk!')
}
闹钟。on('sunrise',doRoosterCall)
AlarmClock.on(‘上班去’,鸣笛声)
//等
要做到这一点,你可以做一些像

//your-module.js
const EventEmitter=require('events')
const singletonClock=new EventEmitter()
函数checkForEvents(){
const currentTime=新日期()
//检查日出,我们将其定义为6:00am+/-10秒
如果(现在('6:00am',10*1000)){
singletonClock.emit('sunrise',currentTime)
}
//检查“工作休假”:上午8:30+/-1分钟
如果(现在('8:30am',60*1000)){
singletonClock.emit('上班请假',currentTime)
}
}
设置间隔(checkForEvents,1000)
module.exports=单时钟

nowIs
是一些节省时间的比较。在执行类似cron的工作时,您应该假设当时间值完全匹配时,您的心跳函数几乎永远不会被触发,因此您需要一些东西来提供“足够接近”的比较。我没有提供impl,因为(1)它似乎是一个外围问题,并且(2) 我确信Momentjs、date fns或其他一些软件包提供了一些很棒的功能,因此您不需要自己实现它。

非常感谢Tom!在我的情况下,“特定时间”字面上是指特定的时间戳。模块需要知道函数名,因为它需要单独调用
apply()
在每个模块上设置
this
。模块可能多次调用一个函数,但调用的
this
不同。用户在实例化我的模块对象时会传入名称。您刚才演示了用户可以手动注册函数,我想现在的问题是,给定函数名称,我可以自动注册吗如果你使用的是真正的模块而不是ol