我正在尝试做瀑布异步,但我没有得到我想要的预期输出。 基本上我的瀑布按预期工作,如果我使用数组而不是查询 所以我想我在回调查询时做错了什么,但我不知道是什么。
代码,当它与我期望的使用数组一起工作时:
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
所有请求都在最后执行:(
如果你知道我能解决什么问题。 感谢
答案 0 :(得分:1)
您的callback(null);
内async.eachSeries
位于请求之后。
要修复这样的内部请求。
request.get(url, {encoding: null} , function(error, response, body) {
console.log('request');
callback(null);
});
另外要明确你实际调用的是重命名回调函数。例如,eachSeries
调用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);
});
}
希望这有帮助。
答案 1 :(得分:1)
您遇到的第一个问题是您的回调名称完全相同,这可能会导致严重问题。无法区分您要调用的回调,这可能导致您的程序执行不应该执行的代码段。
第二个问题是回调放在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");
});