我试图通过传递一个值来从模块中调用一个对象两次。我希望他能够记住我的价值观并继续与它们合作,但事实似乎并非如此。告诉我如何正确地做。
app.js
const {myModule} = require('./myModule')
myModule.setId(Math.random())
myModule.setId(Math.random())
myModule.js
const m1 = {
id: 0,
setId: function (id) {
console.log('setId', id)
m1.id = id
setInterval(m1.showId, 1000)
},
showId: function () {
console.log(m1.id)
}
}
module.exports.myModule = m1
结果(控制台.log):
setId 0.8959027779690547
setId 0.12421047073064084
0.12421047073064084
0.12421047073064084
0.12421047073064084
0.12421047073064084
0.12421047073064084
0.12421047073064084
0.12421047073064084
0.12421047073064084
我希望控制台会有输出:
setId 0.8959027779690547
setId 0.12421047073064084
0.8959027779690547
0.12421047073064084
0.8959027779690547
0.12421047073064084
0.8959027779690547
0.12421047073064084
0.8959027779690547
0.12421047073064084
id
在所有间隔之间共享,因此每个间隔都会打印 id 的最新值,而不是创建间隔时的值。 Closures
可以用来实现这一点。使用 Closures
,间隔的回调函数可以捕获并保留该间隔自己唯一的 id
值。
const m1 = {
id: 0,
setId: function (id) {
console.log('setId', id);
m1.id = id;
// Use an IIFE to create a closure
(function(unieqeId) {
setInterval(function() {
console.log(unieqeId);
}, 1000);
})(id);
},
showId: function () {
console.log(m1.id);
}
}
module.exports.myModule = m1;