Javascript Node-Express中的异步
我对异步函数有点陌生,对如何在async.each中将每个项的回调传递给下一级中间件有点困惑 逻辑:我想检查所有项目,如果项目是类型2,我需要通过emailExists检查电子邮件是否存在!处理完所有项目后,只有在没有类型为2的项目或存在任何电子邮件时,我们才会转到下一个中间件!这里我提到了我的sudocode;如果您能帮助我使用异步函数,我将不胜感激。我对异步函数非常陌生,请告诉我我做错了什么: 请注意,在第二块中,始终存在错误且数据未定义?!为什么呢?即使它将以电子邮件的形式存在。检查 请让我知道,如果你需要任何更多的澄清!谢谢:-Javascript Node-Express中的异步,javascript,node.js,asynchronous,express,callback,Javascript,Node.js,Asynchronous,Express,Callback,我对异步函数有点陌生,对如何在async.each中将每个项的回调传递给下一级中间件有点困惑 逻辑:我想检查所有项目,如果项目是类型2,我需要通过emailExists检查电子邮件是否存在!处理完所有项目后,只有在没有类型为2的项目或存在任何电子邮件时,我们才会转到下一个中间件!这里我提到了我的sudocode;如果您能帮助我使用异步函数,我将不胜感激。我对异步函数非常陌生,请告诉我我做错了什么: 请注意,在第二块中,始终存在错误且数据未定义?!为什么呢?即使它将以电子邮件的形式存在。检查 请让
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只返回一个参数err;但是,如果我们在for-loop中使用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);
}
});
}
}
async.each仅对副作用有用。正如文档所述,传递给迭代器的回调只需要一个参数,而最终的回调只需要一个参数-err。您可能需要async.map,它在传递给迭代器的回调中需要err和transformed,并将err和结果传递给最终回调。谢谢!你完全正确!但for循环中的映射仍然不起作用,或者我不理解您的解决方案!我刚刚更新了我从你的建议中得到的问题!你能帮我一下吗?@Pasargad在你的例子中将async.each替换为async.map。不需要for循环。非常感谢你,伙计!我很感激:-