函数返回undefined,而日志显示结果

时间:2015-07-01 00:22:19

标签: javascript node.js asynchronous foreach ecmascript-5

我想在循环中调用一个函数。 此函数返回undefined,而日志显示函数中的正确输出。

我称之为功能:

function getAllFilters(allFilters){
var allFiltersWithCount =[]
allFilters.forEach(function(item){
    if(item.name != null || typeof(item.name) != 'undefined') {
        allFiltersWithCount.push(function (callback){
            console.log("inloop" + getFiltersByFilterCategory(item.name) );
            callback(null,getFiltersByFilterCategory(item.name));
        });
    }
});

async.parallel(allFiltersWithCount, function(err, result) {
    console.log("results " + result);
    return allFiltersWithCount;
 });
}

我调用的函数的一部分:

function getFiltersByFilterCategory(filterCategory){
 switch(filterCategory){
    case "prescription":
        ProductSchema.aggregate(
            {
                $group:
                {_id: '$prescription', total: {$sum:1}}
            },
        function(err,res){
            var toreturn = {name:"prescription",filters: sort(res)};
          console.log(toreturn);
            return toreturn;
        })
    case "usage": {...}

在我的日志中,我看到了:

inloopundefined (multiplied by the number of loops)
results ,,,,,
 { name: 'prescription',
 filters: 
 [{...},{...},...]

所以我猜它运行这个函数async。但是javascript如何让我正确地做到这一点以及真正发生了什么?他是否将函数返回到早期,然后再执行console.log?或者是什么?

1 个答案:

答案 0 :(得分:1)

假设在窗口对象上定义了getFiltersByFilterCategory函数(在全局范围内定义)。 undefined是日志记录,因为函数最终是使用非窗口的上下文调用的,所以要解决这个问题,你可以将函数声明为闭包中的一个变量,它仍在范围内。

即。下面,(显然,一个更清洁的解决方案将进行重组。)

function getAllFilters(allFilters){ 
var allFiltersWithCount =[]; 
var getFiltersByFilterCategory = function(name){ };
allFilters.forEach(function(item){ 
    if(item.name != null || typeof(item.name) != 'undefined') {  
            allFiltersWithCount.push(function(callback){ 
            console.log("inloop" + getFiltersByFilterCategory(item.name));
            callback(null,getFiltersByFilterCategory(item.name)); 
        }); 
    } 
});