我有以下代码:
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的异步执行中
我该如何解决这个问题?
答案 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