我对async函数有点陌生,有点混淆如何将async.each中的回调传递给下一个级别(中间件)
逻辑:我想浏览所有项目,如果项目是“type2”,我需要通过emailExists检查电子邮件是否存在!只有在没有type2的项目或者是否存在任何电子邮件时,我们才会处理我们转到下一个中间件的所有项目!在这里我提到了我的sudocode;我真的很感激,如果你帮我处理异步功能,我很陌生,请告诉我我做错了什么:
请注意第二个块总是错误的并且数据未定义?!这是为什么?即使它将发送到emailExistence.check!
如果您需要进一步澄清,请告诉我们!谢谢: - )
async.each(Object.keys(items), function (item, callback) {
if (!req.body[item] && items[item].type) {
// assiging the default values based on the default type
switch (items[item].type1) {
case 'name1':
//.
//.No callback functions here
//.
callback();
break;
case 'name2':
//.
//.No callback functions here
//.
callback();
break;
case 'name3':
//.
//.No callback functions here
//.
callback();
break;
case 'name4':
//.
//.No callback functions here
//.
callback();
break;
default:
//.
//.No callback functions here
//.
callback();
break;
}
} else if (items[item].type2) {
emailExistence.check(req.body[item], function (err, exists) {
if (err) {
callback(err);
} else {
callback(null, exists);
}
});
} else {
callback();
}
},
function (err, data) {
// Here always err and data are undefined?! Why is that? Even though it is going to emailExistence.check!
if (err) {
res.json(400, err);
} else {
if (data) {
next();
} else {
res.json(400, {"data": "email not exist"});
}else{
next();
}
}
}
)
更新(回应Aaron):
Aaron你是对的,async.each只返回一个参数(错误);但是如果我们把它放在for循环中,那么map verion就不会起作用了!请你帮助我好吗;这是你用地图编写的版本:
function middleware(req, res, next) {
for (var item in items) {
if (!req.body[item] && items[item].type) {
// assiging the default values based on the default type
switch (items[item].type1) {
case 'name1':
//.
//.No callback functions here
//.
callback();
break;
case 'name2':
//.
//.No callback functions here
//.
callback();
break;
case 'name3':
//.
//.No callback functions here
//.
callback();
break;
case 'name4':
//.
//.No callback functions here
//.
callback();
break;
default:
//.
//.No callback functions here
//.
callback();
break;
}
} else if (items[item].type2) {
var emails = [];
emails.push(req.body[field]);
// In my case here there is just one email (array of one item)
async.map(emails, checkEmail, function (err, result) {
if (!results) {
res.json(400, {"msg": "email does not exist"});
}
});
}
}
next();
function checkEmail(email, callback) {
emailExistence.check(email, function (err, exists) {
if (err) {
callback(err);
} else {
callback(null, exists);
}
});
}
}
答案 0 :(得分:0)
async.each
仅对副作用有用。正如文档所说,传递给迭代器的回调只需要参数,最终的回调只能获得一个参数 - err
。您可能需要async.map
,它希望回调中的err
和transformed
传递给迭代器,并将err
和results
传递给最终的回调。