已调用回调->;异步瀑布式javascript代码

已调用回调->;异步瀑布式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

我有下面的代码。在“addToMongo.push(…)”之后的行中,我得到了“callback已经被调用为error”。对我来说,这没有多大意义,因为它应该只执行一次

主代码:

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