【问题标题】:Javascript async callback hellJavascript异步回调地狱
【发布时间】:2015-01-05 11:06:15
【问题描述】:

我有一个应用程序,我使用 async 来避免“意大利面条回调”并正常工作,但在某些并行调用中,我必须进行一些更改,因为在返回之前必须更改值,因为这些更改产生了相同的例程我想创建一个函数来这样做,从而节省代码,但应用程序无法运行(我是 javascript 新手,正在学习)。

Debug(console.log),在某些情况下的错误是他从不同的请求中调用的同一个回调(如果它们是局部变量不明白这是怎么发生的)。我曾尝试使用 forEach 和 async.each 更改代码,但在这两种情况下我都有错误,不再是更多的更改继续尝试,找不到错误。

我的原始代码(为了避免长篇大论,我总结了一下):

async.parallel({
    today: function(callback){

        data.get('DATA', function(err, dataGet){

            if(err){
                callback(err);
            }
            callback(null, dataGet);
        });
    },
    .... yesteday, week, month ....
    year: function(callback){

        data.get('DATA', function(err, dataGet){

            if(err){
                callback(err);
            }
            callback(null, dataGet);
        });
    }
},
function(error, results){
    --- routine ----
});

我的新代码是这样的:

功能

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

谢谢。

【问题讨论】:

  • 如果我修改了数组值 ( var values = [ .... ] ) 的内容并包含单个元素,它在 async.each 版本中可以正常工作。我不明白发生了什么。

标签: javascript node.js asynchronous callback


【解决方案1】:

已修复!

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

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 2013-11-07
    • 2015-07-11
    • 2017-11-18
    • 1970-01-01
    • 2011-09-08
    • 2018-07-27
    • 2019-06-21
    • 1970-01-01
    相关资源
    最近更新 更多