Node Express中的异步

时间:2014-12-06 22:50:18

标签: javascript node.js asynchronous express callback

我对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);
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

async.each仅对副作用有用。正如文档所说,传递给迭代器的回调只需要参数,最终的回调只能获得一个参数 - err。您可能需要async.map,它希望回调中的errtransformed传递给迭代器,并将errresults传递给最终的回调。