Watch.js仅在某些情况下不观看?

时间:2019-10-22 18:53:22

标签: javascript node.js

我正在Node.js中开发一个基于express-ws的应用程序,并且正在app.ws路由中使用Watch.js监视程序。打开WebSocket时,将使用watch语句中定义的回调函数在全局对象上创建app.ws。然后在ws.on('close', ...函数中,使用相同的对象和回调函数调用unwatch。 (请参见代码段A)

这适用于具有简单布尔项的简单JS对象(请参见代码段A中的stat_A)。但是,很快我将有多个具有不同状态的对象,我想将它们全部放入一个新的JS对象中。因此,这是一个内部带有一堆对象的对象。

片段B是应该等同于片段A的示例。但是,似乎在关闭WebSocket之后,unwatch并不会以某种方式使用,并且{{1 }}已更新,程序尝试通过关闭的WebSocket发送它并崩溃。

我很困惑。是什么导致stat['A']失败?

编辑:通过将unwatch更改为watch(stat, 'A', send_stat),并以相同的方式更改watch(stat['A'], send_stat),我得到了代码片段B的工作。请参见代码段C。现在,我无法取消监视unwatch主列表,请参见代码段D。

代码段A(stat在其他位置已更新):

stat_A

代码段B(const express = require('express'); const app = express(); const expressWs = require('express-ws')(app); const watchjs = require('watchjs'); const port = 1338; var stat_A = {'1': true, '2': false, '3' : false}; app.ws( '/stat_A', (ws, req) => { function send_stat() { ws.send(JSON.stringify(stat_A)); } send_stat(); // Setup watchers watchjs.watch(stat_A, send_stat); ws.on( 'close', () => { // Stop watchers watchjs.unwatch(stat_A, send_stat); } ); } ); app.listen( port, () => { console.log(`Listening (HTTP) on port ${port}!`); } ); 在其他位置已更新):

stat['A']

代码段C(B固定):

const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);
const watchjs = require('watchjs');

const port = 1338;

var stat = {
    'A': {'1': true, '2': false, '3' : false}
};

app.ws(
    '/stat_A',
    (ws, req) => {
        function send_stat() {
            ws.send(JSON.stringify(stat['A']));
        }

        send_stat();
        // Setup watchers
        watchjs.watch(stat, 'A', send_stat);

        ws.on(
            'close',
            () => {
                // Stop watchers
                watchjs.unwatch(stat, 'A', send_stat);
            }
        );
    }
);

app.listen(
    port,
    () => {
        console.log(`Listening (HTTP) on port ${port}!`);
    }
);

代码段D(与B相同,不适用于C):

const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);
const watchjs = require('watchjs');

const port = 1338;

var stat = {
    'A': {'1': true, '2': false, '3' : false}
};

app.ws(
    '/stat_A',
    (ws, req) => {
        function send_stat() {
            ws.send(JSON.stringify(stat['A']));
        }

        send_stat();
        // Setup watchers
        watchjs.watch(stat['A'], send_stat);

        ws.on(
            'close',
            () => {
                // Stop watchers
                watchjs.unwatch(stat['A'], send_stat);
            }
        );
    }
);

app.listen(
    port,
    () => {
        console.log(`Listening (HTTP) on port ${port}!`);
    }
);

1 个答案:

答案 0 :(得分:0)

因此,对此的最终答案如下。

const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);
const watchjs = require('watchjs');

const port = 1338;

var stat = {
    'A': {'1': true, '2': false, '3' : false}
};

app.ws(
    '/stat',
    (ws, req) => {
        function send_stat() {
            ws.send(JSON.stringify(stat));
        }

        send_stat();
        // Setup watchers
        Object.keys(stat).forEach((key) => {
            watchjs.watch(stat[key], send_stat);
        })

        ws.on(
            'close',
            () => {
                // Stop watchers
                Object.keys(stat).forEach((key) => {
                    watchjs.unwatch(stat[key], send_stat);
                })
            }
        );
    }
);

app.ws(
    '/stat/A',
    (ws, req) => {
        function send_stat() {
            ws.send(JSON.stringify(stat['A']));
        }

        send_stat();
        // Setup watcher
        watchjs.watch(stat['A'], send_stat);

        ws.on(
            'close',
            () => {
                // Stop watcher
                watchjs.unwatch(stat['A'], send_stat);
            }
        );
    }
);

app.listen(
    port,
    () => {
        console.log(`Listening (HTTP) on port ${port}!`);
    }
);