当mysql查询asynchronous瀑布不按顺序

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

代码当它与我期望使用数组:

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 

所有的请求得到执行结束:(

如果你有什么我可以修复的想法。 谢谢

你遇到的第一个问题是你的callback有完全相同的名字,这可能会导致严重的问题。 你想要调用的callback不能被区分,这可能导致你的程序执行一些代码,直到以后才能执行。

第二个问题是callback放在request.get函数之外。 节点js的本质意味着它不会等到request.get函数返回,而是直接调用callback函数。 通过在request.get函数内放置callback,它被迫等待请求函数返回,然后调用callback函数。 你的代码的修改版本如下。

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

你的callback(null); 里面的async.eachSeries在请求之后。

只要把这个里面的要求修好就可以了。

 request.get(url, {encoding: null} , function(error, response, body) { console.log('request'); callback(null); }); 

另外要清楚你实际调用的是什么,重命名callback函数。 例如eachSeries callback eachSeries调用

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

希望这可以帮助。