对象

时间:2018-02-14 17:03:59

标签: node.js function setinterval schedule

我有以下代码:

var mmanager = require("./mmanager");
var { spawn } = require("child_process");

var exports = {
    interval: {},
    setup: function (n){
        if(n){
            this.n = n;
        }
    },
    continuous_scan: function (){
        console.log("Setting intervals");
        this.interval = setInterval(this.get_connections,120000); //120000 ms
        console.log("Interval:",this.interval);
        this.get_connections();
    },
    get_connections: function (){
        if(this.n){
            let py = spawn("python3",["get_connections.py"]);
            let dataString = '';
            py.stdout.on("data", (data) => {
                dataString += data;
            });
            py.stdout.on("end",() => {
                var response = JSON.parse(dataString);
                if(this.scan){
                    this.last_scan = this.scan;
                }
                this.scan = response;
                let obj = {
                    data: response,
                    n: this.n
                }
                mmanager.insert(obj,function(err,res){
                    if(err){
                        console.log("Error inserting data");
                        return;
                    }
                    console.log(res);
                    if(this.interval){   //some debug to see what happens
                        console.log(this.interval);
                    }else{
                        console.log("interval not found");
                    }
                    return;
                });

            });
            console.log("Start capturing ("+this.n+") ...");
            py.stdin.write(JSON.stringify(this.n));
            py.stdin.end();
        }
    },
    stop_scan: function (){
        if(this.interval){
            this.interval.clearInterval();
            return true;
        }else{
            return false;
        }
    }
}

module.exports = exports;

我想做的是每2分钟执行一次python3脚本并将数据插入数据库。 当我运行这段代码时,我得到了第一次执行代码,但似乎在其他代码中失败了。

我也看到在执行get_connections时找不到间隔。

输出:

Setting intervals
Interval: Timeout {
  _called: false,
  _idleTimeout: 120000,
  _idlePrev: 
   TimersList {
     _idleNext: [Circular],
     _idlePrev: [Circular],
     _timer: Timer { '0': [Function: listOnTimeout], _list: [Circular] },
     _unrefed: false,
     msecs: 120000,
     nextTick: false },
  _idleNext: 
   TimersList {
     _idleNext: [Circular],
     _idlePrev: [Circular],
     _timer: Timer { '0': [Function: listOnTimeout], _list: [Circular] },
     _unrefed: false,
     msecs: 120000,
     nextTick: false },
  _idleStart: 336,
  _onTimeout: [Function: get_connections],
  _timerArgs: undefined,
  _repeat: 120000,
  _destroyed: false,
  [Symbol(asyncId)]: 6,
  [Symbol(triggerAsyncId)]: 1 }
Start capturing (2) ...
{... 
some successful result 
...}
interval not found

2分钟后它没有跟进。

我不知道问题是在分配区间变量还是在node.js的异步执行中

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

当将get_connection作为回调传递给setInterval时,您将松开对导出对象的引用,而 let count = 0; let countEl = document.getElementById("count"); function plus(){ count++; countEl.value = count; } function minus(){ if (count > 1) { count--; countEl.value = count; } } 不是导出而是全局对象。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

  

在大多数情况下,其值取决于函数的调用方式。它不能在执行期间通过赋值来设置,并且每次调用函数时它可能不同。 ES5引入了绑定方法来设置函数的值,无论它是如何被调用的,并且ES2015引入了箭头函数,它们不提供它们自己的这种绑定(它保留了这个值封闭的词汇语境。)

要获得正确的权限,您可以将函数绑定到exports对象,或者在函数调用周围放置一个闭包。

this