已调用回调->;异步瀑布式javascript代码
我有下面的代码。在“addToMongo.push(…)”之后的行中,我得到了“callback已经被调用为error”。对我来说,这没有多大意义,因为它应该只执行一次 主代码:已调用回调->;异步瀑布式javascript代码,javascript,node.js,ecmascript-6,node-async,Javascript,Node.js,Ecmascript 6,Node Async,我有下面的代码。在“addToMongo.push(…)”之后的行中,我得到了“callback已经被调用为error”。对我来说,这没有多大意义,因为它应该只执行一次 主代码: async.waterfall([ (callback) => { sql.query("SELECT id FROM ....", (err, rows, fields) => { err ? callback(err, []) : callback(null, row
async.waterfall([
(callback) => {
sql.query("SELECT id FROM ....", (err, rows, fields) => {
err ? callback(err, []) : callback(null, rows);
});
},
(rows, callback) => {
/*Begin for-loop*/
for (var i = 0; i < rows.length; i++) {
let id = rows[i].id;
async.waterfall([
(callb) => {
console.log("doing getvalues");
getValues.push(id, (err, values) => {
err ? callb(err, []) : callb(null, values);
});
},
(values, callb) => {
console.log("doing addtomongo");
addToMongo.push(values, (err, res) => {
err ? callb(err, []) : callb(null, res);
});
}
],
(err, res) => {
err ? callback(err) : console.log("res");
});
} /*End for-loop*/
}
], (err, result) => {
err ? console.trace(err) : "";
});
});
这里发生了嵌套瀑布和队列的复杂混合。我建议您研究类似的东西,它可以极大地简化您的代码。谢谢。但co似乎正是async所做的。这对我没有多大帮助。我将简化此代码,但我想知道这里有什么问题。这是一个很好的学习op机会,我想我可能遗漏了一些我需要知道的关于异步的东西。如果你在做异步的事情,在你的代码中使用像
for
这样的同步控制结构几乎总是一个错误。如果你需要处理一组项,你应该使用async.map
或async.mapSeries
谢谢Logan。我听从了你的建议,删除了for循环,并使用async.each对行进行了迭代。代码实际上变得更加简洁,现在可以运行了。我仍然不太高兴,因为我相信它可以做得更好,我不知道为什么会出现这个错误。@trichter87不,代码可以用Cotl表达得更清晰。这是一个非常复杂的问题这里发生了嵌套瀑布和队列的复杂混合。我建议您研究类似的东西,这样可以大大简化您的代码。谢谢。但co似乎正是async所做的。这对我没有多大帮助。我将简化此代码,但我想知道这里有什么问题。这是一个很好的学习机会,我认为我可能遗漏了一些我需要知道的关于异步的内容。如果你在做异步的事情,那么在你的代码中使用像for
这样的同步控制结构几乎总是一个错误。如果你需要处理一组项,你应该使用async.map
或async.mapSeries
谢谢你,Logan。我听从了你的建议并且删除了for循环并使用async.each来迭代行。代码实际上变得更简洁,现在可以工作了。我仍然不太满意,因为我相信它可以做得更好,而且我不知道为什么会出现错误。@trichter87不,代码可以用co表达得更清晰
var getValues = async.queue((id, callback) => {
let q = query;
sql.query(q, (err, rows, fields) => {
err ? callback(err, []) : callback(null, rows);;
});
}, 5);
var addToMongo = async.queue((values, callback) => {
callback(null, "done");
}, 5);