Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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异步回调地狱_Javascript_Node.js_Asynchronous_Callback - Fatal编程技术网

Javascript异步回调地狱

Javascript异步回调地狱,javascript,node.js,asynchronous,callback,Javascript,Node.js,Asynchronous,Callback,我有一个应用程序,我使用async来避免“意大利面回调”,并且工作正常,但在某些并行调用中,我必须进行一些更改,因为在返回之前必须更改值,因为这些更改执行了与我所想的相同的例程,以便生成一个函数,从而保存代码,但无法运行应用程序(我是javascript新手,正在学习) 调试(console.log),在某些情况下,错误是从不同的请求调用的同一回调(如果它们是本地变量,则不理解这是如何发生的)。我曾尝试使用forEach和async.each更改代码,但在这两种情况下,我都有错误,不再需要继续尝

我有一个应用程序,我使用async来避免“意大利面回调”,并且工作正常,但在某些并行调用中,我必须进行一些更改,因为在返回之前必须更改值,因为这些更改执行了与我所想的相同的例程,以便生成一个函数,从而保存代码,但无法运行应用程序(我是javascript新手,正在学习)

调试(console.log),在某些情况下,错误是从不同的请求调用的同一回调(如果它们是本地变量,则不理解这是如何发生的)。我曾尝试使用forEach和async.each更改代码,但在这两种情况下,我都有错误,不再需要继续尝试更多更改,无法找到错误

我的原始代码(为了避免长篇大论,我对其进行了总结):

我的新代码是:

功能

function getDataChange(key, valuePass, callback){

    var values = [ .... ],
        totalData = 0.00;

    /*
    async.each(values, function(value, cb){

        var keyR = key.replace(/%value%/g, value.toLowerCase() );

        data.get(keyR, function(err, dataGet){

            if(err){
                cb(err);
            }

            dataGet = ( dataGet !== null ) ? dataGet : 0 ;

            if( valuePass === value ) {

                totalData += parseFloat( dataGet );
                cb();

            } else {

                valueConverter.convert({ force: true, multi: true }, function(data){

                    totalData += parseFloat( data );
                    cb();
                });
            }
        });
    },
    function(err){

        if(err){
            callback(err);
        } else {
            callback(null, totalData );
        }
    });
    */

    var totals = values.length;

    values.forEach(function(value){ 

        var keyR = key.replace(/%value%/g, value.toLowerCase() );

        data.get(keyR, function(err, dataGet){

            if(err){
                return callback(err);
            }
            dataGet = ( dataGet !== null ) ? dataGet : 0 ;
            total--;

            if( valuePass === value ) {

                totalData += parseFloat( dataGet );

                if( totals === 0 ){     
                    callback(null, totalData);
                }
            } else {

                valueConverter.convert({ force: true, multi: true }, function(data){

                    totalData += parseFloat( data );

                    if( totals === 0 ){
                       callback(null, totalData);
                    }
                });
            }
        });
    });
    //callback(null, totalData);
}
并更改主要例程:

var keyBase = '......',
    value = '.....';

async.parallel({

    today: function(callback){
        /*
        data.get('DATA', function(err, dataGet){

            if(err){
                callback(err);
            }
            callback(null, dataGet);
        });
        */
        getDataChange(keyBase + 'DATAD', value, function(err, returnData){

            if(err){
                callback(err);
            }
            //console.log('## Return Data today');
            callback(null, returnData);
        });
        //callback(null, 0);
    },
    .... yesteday, week, month ....
    year: function(callback){

        getDataChange(keyBase + 'DATAY', value, function(err, returnData){

            if(err){
                callback(err);
            }
            console.log('## Return Data year');
            callback(null, returnData);
        });
    }
},
function(error, results){
    --- routine ----
});
我想我必须复制在并行异步调用中引入的代码,因为我无法操作

我的错误是多种多样的。在各种测试中,我对函数调用进行了注释,并在几个并行调用中建立了从回调返回到0的值,并且我看到没有运行最终的async.parallel回调函数(例如,如果我注释了除今天、昨天和星期之外的所有调用)。在其他情况下(将所有调用建立为注释,并将值设置回0,昨天和星期除外),运行两次每周回调。如果对函数的所有调用都进行了注释(星期和今天除外),则会导致异常,显示消息“错误:回调已被调用”

我被困了好几天,找不到错误,也找不到如何解决这个问题:-S

谢谢。

修复


使用函数的其中一个模块被称为web api请求,响应延迟得多。

如果我修改数组值(var values=[…])的内容并包含一个元素,它在async中正常工作。每个版本。我不知道发生了什么。
var keyBase = '......',
    value = '.....';

async.parallel({

    today: function(callback){
        /*
        data.get('DATA', function(err, dataGet){

            if(err){
                callback(err);
            }
            callback(null, dataGet);
        });
        */
        getDataChange(keyBase + 'DATAD', value, function(err, returnData){

            if(err){
                callback(err);
            }
            //console.log('## Return Data today');
            callback(null, returnData);
        });
        //callback(null, 0);
    },
    .... yesteday, week, month ....
    year: function(callback){

        getDataChange(keyBase + 'DATAY', value, function(err, returnData){

            if(err){
                callback(err);
            }
            console.log('## Return Data year');
            callback(null, returnData);
        });
    }
},
function(error, results){
    --- routine ----
});