Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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 mysql查询时异步瀑布不遵循顺序_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript mysql查询时异步瀑布不遵循顺序

Javascript mysql查询时异步瀑布不遵循顺序,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我正在尝试进行瀑布异步,但没有得到我想要的预期输出。 基本上,如果我使用数组而不是查询,我的瀑布就可以正常工作 所以我猜我在查询回调时做错了什么,但我不知道是什么 当它与我期望的使用数组时进行编码: function range(start, end) { var foo = []; for (var i = start; i <= end; i++) { foo.push(i); } return foo; } users = ra

我正在尝试进行瀑布异步,但没有得到我想要的预期输出。 基本上,如果我使用数组而不是查询,我的瀑布就可以正常工作 所以我猜我在查询回调时做错了什么,但我不知道是什么

当它与我期望的使用数组时进行编码:

    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");
});
但是当我尝试用mysql查询数据时,问题来了 代码:

输出:

loop
request
loop
request
Finish
loop
request
loop
request
Finish
User For Loop Completed
loop
loop
Finish
loop
loop
Finish
User For Loop Completed
request
request
request
request
所有请求都将在末尾执行:(

如果你知道我能解决什么问题。 感谢您的
回调(null);
内部
异步。每个系列
都是在请求后提供的

要解决这个问题,只需将这样的请求放入内部即可

request.get(url, {encoding: null} , function(error, response, body) {
  console.log('request');
  callback(null);
});
另外,要清楚您实际调用的重命名回调函数是什么。例如,
eachSeries中的回调
call
next

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

希望这能有所帮助。

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

第二个问题是回调被放置在request.get函数的外部。节点js的性质意味着它不会等到request.get函数返回,而是直接调用回调。通过将回调放置在request.get函数内部,它被迫等待,直到request函数返回并返回然后调用回调。下面是代码的修订版本

 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");
 });

感谢您的解释,非常清楚!对于您的第一点,我假设事件虽然回调的名称具有相同的名称,但它尊重每个函数的范围。但我会养成良好的习惯将其重命名。不客气!很高兴我能为您提供帮助!回调的范围受到尊重,这可能是真的,但正如您所说,我给它们取不同的名字绝对是一种好的做法。这将避免在使用多个嵌套异步方法时出现混淆,并且允许您在需要时实际指定父方法的回调。
 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");
 });