我试图做一个瀑布异步,但我没有得到想要的预期输出。
基本上,如果我使用数组而不是查询,我的瀑布将按预期工作
所以我想我在查询的回调上做错了什么,但我不知道是什么。

当它与我期望使用数组一起工作时的代码:

    function range(start, end) {
    var foo = [];
    for (var i = start; i <= end; i++) {
        foo.push(i);
    }
    return foo;
}
users = range(1,2)
obj = [1,2];
async.forEachLimit(users, 1, function(user, userCallback){
    async.waterfall(
        [
            function(callback) { // query the data to get the category and specific number  of rows
            results = {sku_config:'A',img:'http//blabla',sku_config:'B',img:'http//bloblo'}
            callback(null, results);


            },
            function(obj,callback) {
                async.eachSeries(obj, function (sku, callback) {
                    var url = sku.img;
                    var sku = sku.sku_config;
                    console.log("loop");
                            request.get(url, {encoding: null} , function(error, response, body) {
                                console.log('request');
                            });

                    callback(null);
                }, function(responsetoendofloop){
                        callback(null);
                });
            },
        ],
        function (err) {
            console.log('Finish');
            userCallback(null);
        }
    );
}, function(err){
    console.log("User For Loop Completed");
});


输出:

loop
request
loop
request
Finish
loop
request
loop
request
Finish
User For Loop Completed


但是当我尝试使用mysql查询数据时出现问题
码:

async.forEachLimit(users, 1, function(user, userCallback){
    async.waterfall(
        [
            function(callback) { // query the data to get the category and specific number  of rows
                connection.query(query_sku,
                ['Fashion',1,2],
                    function(err, results, fields) {
                        if (err)
                            throw err;
                 callback(null, results);
                });

            },
            function(obj,callback) {
                async.eachSeries(obj, function (sku, callback) {
                    var url = sku.img;
                    var sku = sku.sku_config;
                    console.log("loop");
                            request.get(url, {encoding: null} , function(error, response, body) {
                                console.log('request');
                            });

                    callback(null);
                }, function(responsetoendofloop){
                        callback(null);
                });
            },
        ],
        function (err) {
            console.log('Finish');
            userCallback(null);
        }
    );
}, function(err){
    console.log("User For Loop Completed");
});


输出:

loop
loop
Finish
loop
loop
Finish
User For Loop Completed
request
request
request
request


所有请求都在末尾执行:(

如果您对我可以解决的想法。
谢谢

最佳答案

您遇到的第一个问题是您的回调名称完全相同,这可能会导致严重问题。您要调用的回调无法区分,这可能导致您的程序执行直到以后才应该执行的代码段。

第二个问题是该回调位于request.get函数之外。节点js的本质意味着它不会等到request.get函数返回,而是立即调用回调。通过将回调放置在request.get函数中,它被迫等待,直到请求函数返回,然后调用该回调。您的代码的修订版如下。

 async.forEachLimit(users, 1, function(user, userCallback){
    async.waterfall(
    [
        function(callback) { // query the data to get the category and specific number  of rows
            connection.query(query_sku,
            ['Fashion',1,2],
                function(err, results, fields) {
                    if (err)
                        throw err;
                    callback(null, results);
            });

        },
        function(obj,callback) {
            async.eachSeries(obj, function (sku, seriesCallback) {
                var url = sku.img;
                var sku = sku.sku_config;
                console.log("loop");
                request.get(url, {encoding: null} , function(error, response, body) {
                    console.log('request');
                    seriesCallback(null);
                });

            }, function(responsetoendofloop){
                    callback(null);
            });
        },
    ],
    function (err) {
        console.log('Finish');
        userCallback(null);
    });
 }, function(err){
     console.log("User For Loop Completed");
 });

08-25 15:34
查看更多