Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node-Express中的异步_Javascript_Node.js_Asynchronous_Express_Callback - Fatal编程技术网

Javascript Node-Express中的异步

Javascript Node-Express中的异步,javascript,node.js,asynchronous,express,callback,Javascript,Node.js,Asynchronous,Express,Callback,我对异步函数有点陌生,对如何在async.each中将每个项的回调传递给下一级中间件有点困惑 逻辑:我想检查所有项目,如果项目是类型2,我需要通过emailExists检查电子邮件是否存在!处理完所有项目后,只有在没有类型为2的项目或存在任何电子邮件时,我们才会转到下一个中间件!这里我提到了我的sudocode;如果您能帮助我使用异步函数,我将不胜感激。我对异步函数非常陌生,请告诉我我做错了什么: 请注意,在第二块中,始终存在错误且数据未定义?!为什么呢?即使它将以电子邮件的形式存在。检查 请让

我对异步函数有点陌生,对如何在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循环。非常感谢你,伙计!我很感激:-