我有一个node.js流,我暂时写入这样的数组:
var tempCrossSection = [];
stream.on('data', function(data) {
tempCrossSection.push(data);
});
然后我定期获取该数组中的数据(并清除它)并对其进行一些处理,如下所示:
var crossSection = [];
setInterval(function() {
crossSection = tempCrossSection;
tempCrossSection = [];
someOtherFunction(crossSection, function(data) {
console.log(data);
}
}, 30000);
问题是我得到一些奇怪的行为,其中流被写入数组的顺序以及当流速增加和/或someOtherFunction回调花费太长时触发的setInterval回调数。
我应该如何实现这一点,以便流正确地将数据写入数组(按顺序),并且每个setInterval回调进行一次数据处理。
答案 0 :(得分:1)
您的代码存在一些问题。首先,你要与很多州分享。 例如,crossSection应该只在匿名Interval函数中定义。 为什么“crossSection”被定义为闭包?如果someOtherFunction运行很长一段时间,你可能确实遇到了某种竞争条件。
var source = [];
stream.on('data', function(data) {
source.push(data);
});
setInterval(function() {
var target = source;
source = [];
someOtherFunction(target, function(data) {
console.log(data);
}
}, 30000);
如果您可以访问 someOtherFunction ,那么我会重写像这样的整个事情
var source = [];
stream.on('data', function(data) {
source.push(data);
});
setInterval(function() {
var processing = true;
while (processing) {
var elem = source.shift();
someOtherFunction(elem, function(data) {
console.log(data);
});
processing = checkForBreakConditionAndReturnFalseIfBreak();
}
}, 30000);
如果元素数量大到 someOtherFunctions 需要很长时间,你可能会遇到一些问题。所以我可能会做这样的事情
var source = [];
var timerId = 0;
stream.on('data', function(data) {
source.push(data);
});
function processSource() {
clearTimeout(timerId);
var processing = true;
while (processing) {
var elem = source.shift();
someOtherFunction(elem, function(data) {
console.log(data);
});
processing = checkForBreakConditionAndReturnFalseIfBreak();
}
setTimeout(processSource, calcTimeoutForNextProcessingDependentOnPastData());
};
setTimeout(processSource, 30000); //initial Timeout