日志显示结果时函数 returns 未定义
function returns undefined while log shows result
我想在循环中调用一个函数。
此函数 returns 未定义,而日志显示函数中的正确输出。
我在哪里调用函数:
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:
[{...},{...},...]
所以我猜它异步运行这个函数。但是 javascript 如何让我正确地做到这一点以及真正发生了什么?他 returns 功能是否提早,然后才执行 console.log ?或者什么?
假设 getFiltersByFilterCategory 函数是在 window 对象上定义的(在全局范围内定义)。 undefined 正在记录,因为该函数最终是在非 window 的上下文中调用的,因此要解决此问题,您可以将该函数声明为闭包内的变量,它仍在范围内。
即下面,(显然将重组更清洁的解决方案。)
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));
});
}
});
我想在循环中调用一个函数。 此函数 returns 未定义,而日志显示函数中的正确输出。
我在哪里调用函数:
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:
[{...},{...},...]
所以我猜它异步运行这个函数。但是 javascript 如何让我正确地做到这一点以及真正发生了什么?他 returns 功能是否提早,然后才执行 console.log ?或者什么?
假设 getFiltersByFilterCategory 函数是在 window 对象上定义的(在全局范围内定义)。 undefined 正在记录,因为该函数最终是在非 window 的上下文中调用的,因此要解决此问题,您可以将该函数声明为闭包内的变量,它仍在范围内。
即下面,(显然将重组更清洁的解决方案。)
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));
});
}
});