我目前正在尝试迭代一系列JSON元素,解析并将我需要的数据添加到特殊格式的字符串中,一旦满足条件,就开始上传这些数据。
然而,我遇到的问题是我的变量'deviceOutString'被返回为未定义,留下了一个'undefined'字符串,写入的数量与数组中的JSON元素一样多。我知道'checkDuplicates'函数的返回是正确的,因为在返回值之前,日志显示该值是正确的。
我已在下面附上我的代码,如果您有任何想法,请与我们联系。
谢谢!
旧代码(稍后更新)
var i=0;
var parsedJson = JSON.parse(storedData) ;
var storedDataSize = parsedJson.length;
console.log('Stored Data Size: '+storedDataSize);
var async = require('async');
async.each(parsedJson, function( subElemJson, callback1) {
async.series([
function(callback){
console.log('dstring: ' + deviceOutString);
console.log('i : ' + i);
var subElemJsonPretty = JSON.stringify(subElemJson,null,0) ;
var date = subElemJson['date'];
deviceOutString += checkDuplicates(subElemJson, deviceOutString);
console.log('theLoop*DString: ' + deviceOutString);
callback(null, 'one');
},
function(callback){
if((i == storedDataSize - 1 || count == 225) && storedDataSize > 0) {
writeDCC(deviceOutString);
count = 0;
makeList();
}
i++;
callback(null, 'two');
setTimeout(function () { callback1(); }, 500);
}
]);
}); }
更新了新代码
function theLoop(storedData) {
var deviceOutString = '<list>';
var temp;
try {
var i=0;
var parsedJson = JSON.parse(storedData) ;
var storedDataSize = parsedJson.length;
console.log('Stored Data Size: '+storedDataSize);
var async = require('async');
var delayed = require('delayed');
async.each(parsedJson, function( subElemJson, callback1) {
async.series([
function(callback){
var subElemJsonPretty = JSON.stringify(subElemJson,null,0) ;
var date = subElemJson.date;
console.log('THIS IS THE DATE: '+date);
temp = checkDuplicates(subElemJson, deviceOutString);
console.log('This is the temp: ' + temp);
callback(null, temp);
}
], function(results){
console.log('*****Results are In*****: ' + results);
deviceOutString =+ temp;
if((i == storedDataSize - 1 || count == 225) && storedDataSize > 0) {
writeDCC(deviceOutString);
count = 0;
deviceOutString = '<list>';
}
i++;
callback1(results);
});
},
function(err){
if( err ) {
console.log('A file failed to process');
} else {
console.log('All files have been processed successfully');
}
});
} catch (error) {
console.info('Exception parsing ' + '\n\n' + error);
return;
}
}
答案 0 :(得分:0)
所以有一些事情
1:var date = subElemJson['date'];
通过数组语法访问对象属性是一种不好的做法。尼特挑剔但嘿:P尝试var data = subElemJson.date;
而不是。
2:deviceOutString
未在您提供的代码中的任何位置定义。
3:async.series
和async.each
都需要一个回调函数来完成每一个。这是调用callback(null, 'one');
的全部要点 - 您将值传递给最终async.series
回调中的“results”数组。你在错误的地方调用setTimeout(function() { callback1(); }, 500);
(也随意将它置于超时之后?)。
正确的async.series格式是:
async.series([
function(callback) {
// do stuff
callback(null, someValue);
},
function(callback) {
// do other stuff
callback(null, someOtherValue);
}
], function(results) {
// all the stuffs are done
console.log(results); <-- results is an array containing "someValue" and "someOtherValue" from the iterations above
callback1(results);
});
另外,async.each也在同一条船上 - 它希望你传递一个“我正在循环的所有事情现在已经完成!”功能最后。
.each()
上的异步文档(向下滚动.series()
上的文档):https://github.com/caolan/async#each