函数返回undefined Node JS

时间:2014-08-20 21:18:17

标签: node.js

我目前正在尝试迭代一系列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;
  } 
}

1 个答案:

答案 0 :(得分:0)

所以有一些事情

1:var date = subElemJson['date'];通过数组语法访问对象属性是一种不好的做法。尼特挑剔但嘿:P尝试var data = subElemJson.date;而不是。

2:deviceOutString未在您提供的代码中的任何位置定义。

3:async.seriesasync.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