node.js 中的模块及其行为

问题描述 投票:0回答:1

我试图通过传递一个值来从模块中调用一个对象两次。我希望他能够记住我的价值观并继续与它们合作,但事实似乎并非如此。告诉我如何正确地做。

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
node.js node-modules
1个回答
0
投票

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;

这可以让您看到预期的执行结果。 了解 ClosureIIFE 也会很有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.