Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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.js+异步系列执行_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript node.js+异步系列执行

Javascript node.js+异步系列执行,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,在我的节点应用程序中,我使用async.series执行3个查询,它执行得非常好。。但在我的第三次查询执行中,我必须根据第三次查询的结果执行另一个查询,它也可以正常工作。但是我不能在第三个查询中执行一些逻辑,所以在所有查询完成之后,我只需要调用callback 我的代码: async.series({ levels: function(cb) { sequelize.query("select country_id, country_name, level0, level

在我的节点应用程序中,我使用async.series执行3个查询,它执行得非常好。。但在我的第三次查询执行中,我必须根据第三次查询的结果执行另一个查询,它也可以正常工作。但是我不能在第三个查询中执行一些逻辑,所以在所有查询完成之后,我只需要调用callback

我的代码:

async.series({
    levels: function(cb) {
        sequelize.query("select country_id, country_name, level0, level1, level2, level3, level4 from levels").success(function(levelsResults) {
            levelsResult = levelsResults;
            cb(null, levelsResult);
        })
    },
    level1: function(cb) {
        sequelize.query("select id_0, name_0, name_1 from xxxxx group by id_0, name_0, name_1").success(function(level1Result) {
            level1result = level1Result;
            cb(null, level1result);
        })
    },
    keys: function(cb) {
        sequelize.query("select id_0 from xxxx group by id_0").success(function(id_0Result) {
            var obj = {};
            for (var i = 0; i < id_0Result.length; i++) {
                sequelize.query("select id_0, value->>'yyyy' as value from xxxx where id_0 = " + id_0Result[i].id_0 + " limit 1").success(function(keyResult) {
                    var keyArray = [];
                    var keysObjectArray = [];
                    id_0 = keyResult[0].id_0;
                    keyResult = keyResult[0].value;
                    keyResult = JSON.parse(keyResult);

                    for (var prop in keyResult) {
                        keyArray.push(prop)
                    }
                    obj["" + id_0 + ""] = keyArray;
                    keysObjectArray.push(obj);
                    cb(null, keysObjectArray);
                    ---.my problem is here cb is called in the 1st iteration of
                    for loop.It should be called after loop finishes

                })
            }
        })
    }
}, function seriesFinal(seriesErr, seriesResults) {
    if (seriesErr) throw new Error("Something bad!");
    onSuccess(JSON.stringify(seriesResults), callback);

});
但我期待的是:

{"levels":[{levsls}],"level1":[{level1}],"keys":[{},{}]};
编辑:

简单地说,我如何使sequalize查询执行for循环并最终调用回调


请帮助我解决此问题。。提前感谢。…

for循环运行n个查询,随机回调success函数

您可以使用计数器确保所有查询都被回调

sequelize.query("select id_0 from xxxx group by id_0").success(function(id_0Result){
                var obj = {};
                var counter = 0;
                for(var i=0; i<id_0Result.length; i++){
                    sequelize.query("select id_0, value->>'yyyy' as value from xxxx where id_0 = "+id_0Result[i].id_0+" limit 1").success(function(keyResult){
                            var keyArray=[];
                            var keysObjectArray =[];
                            id_0 = keyResult[0].id_0;                                
                            keyResult = keyResult[0].value;
                            keyResult = JSON.parse(keyResult);

                            for (var prop in keyResult){
                                keyArray.push(prop)
                            }                                
                            obj[""+id_0+""] = keyArray;                                
                            keysObjectArray.push(obj);   
                            counter  +=1;
                            if(counter === id_0Result.length )
                            {                             
                               cb(null, keysObjectArray);
                            }

                    })
                }
请注意,KeyObjectArray中的顺序是随机的,回调也是随机的

希望能有帮助

Yoann

不仅仅是async.series!您可以使用async.forEach执行循环,对于键函数,async.map将很好地执行以下操作:

keys: function(cb) {                   
    sequelize.query("select id_0 from xxxx group by id_0").success(function(id_0Result){
        var obj = {};
        // Loop over each object in id_0Result, 
        // and transform it into a new array
        async.map(
            id_0Result, 
            function(result, cb) {
                sequelize.query("select id_0, value->>'yyyy' as value from xxxx where id_0 = "+result.id_0+" limit 1").success(function(keyResult){
                    var keyArray=[];
                    id_0 = keyResult[0].id_0;                                
                    keyResult = keyResult[0].value;
                    keyResult = JSON.parse(keyResult);

                    for (var prop in keyResult){
                        keyArray.push(prop)
                    }                                
                    obj[""+id_0+""] = keyArray;
                    // Add this object to the array result for async.map
                    return cb(null, obj);
                })
            }, 
            // Call the callback for async.series with the result of
            // the mapping; effectively cb(null, transformedArray)
            cb
        );
    });
}

谢谢@Scott Gress..我还有一个疑问。。我有一个对象数组。如果可以通过从我的对象中获取id_0来创建键值对,我想async.map会对我有所帮助。。
keys: function(cb) {                   
    sequelize.query("select id_0 from xxxx group by id_0").success(function(id_0Result){
        var obj = {};
        // Loop over each object in id_0Result, 
        // and transform it into a new array
        async.map(
            id_0Result, 
            function(result, cb) {
                sequelize.query("select id_0, value->>'yyyy' as value from xxxx where id_0 = "+result.id_0+" limit 1").success(function(keyResult){
                    var keyArray=[];
                    id_0 = keyResult[0].id_0;                                
                    keyResult = keyResult[0].value;
                    keyResult = JSON.parse(keyResult);

                    for (var prop in keyResult){
                        keyArray.push(prop)
                    }                                
                    obj[""+id_0+""] = keyArray;
                    // Add this object to the array result for async.map
                    return cb(null, obj);
                })
            }, 
            // Call the callback for async.series with the result of
            // the mapping; effectively cb(null, transformedArray)
            cb
        );
    });
}