gpt4 book ai didi

javascript - mysql查询时异步 waterfall 不遵循顺序

转载 作者:行者123 更新时间:2023-11-30 15:35:24 24 4
gpt4 key购买 nike

我正在尝试执行 waterfall 式异步,但没有得到我想要的预期输出。如果我使用数组而不是查询,基本上我的 waterfall 会按预期工作所以我想我在查询的回调中做错了什么,但我不知道是什么。

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

    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 函数之外。 node 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");
});

关于javascript - mysql查询时异步 waterfall 不遵循顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41637389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com