缓存异步函数的结果,并将其传递给 Async.js 中的下一个函数

Cache result from async function, and pass it to next function in Async.js

这两天一直在努力完成follow,就是解决不了。我觉得我已经尝试了一切。所以这里...

我的路线有一个 JSON 对象,其中包含创建新测验的所有信息。 换句话说 - 一个对象,其中包含有关新测验的信息,一组问题,其中每个问题都包含一组答案。

我使用 async.js 瀑布函数,并希望执行以下操作:

这是我得到的:

router.post('/quiz/create', function (req, res) {
    // JSON object with the new Quiz
    var json = req.body;
    async.waterfall([
        function(callback) {
            // Returns a Quiz ID for the new quiz, and passes it to the next waterfall function
            db.createQuiz(json, function(err, result) {
                // ID returned from DB is formatted as [{'': id}], hence result[0]['']
                callback(null, result[0]['']);
            });
        },
        function(quizID, callback) {
            // Loop through each question in the quiz
            async.forEachSeries(json.questions, function(question, callback) {
               // Save the question to DB, and get the new question ID returned
               db.createQuestion(question, quizID, function(err, result) {
                   // TODO: cache the new question ID's in an array somewhere to be passed to the next waterfall function
                   // Start next iteration of the loop
                   callback();
               });
            }, function(err) {
                // Done with all questions. Pass question ID's to next function
                callback(null, cachedQuestionIDs);
            });
        },
        function(cachedQuestionIDs, callback) {
            // TODO: access the question ID's, and use them to loop through and save answers to DB
        }
    ], function(err, result) {
        res.json({
           success: true,
           message: 'Quiz created!'
       });
    });
});

只需将值存储在 async.forEachSeries() 之外但在 async.waterfall() 控制流中的包装第二个函数内的数组中。当你的 async.forEachSeries() 执行完成后,你可以 return 这个数组。

function(quizID, callback) {
  var cachedQuestionIDs = [];

  // Loop through each question in the quiz
  async.forEachSeries(json.questions, function(question, callback) {
    // Save the question to DB, and get the new question ID returned
    db.createQuestion(question, quizID, function(err, result) {
      // Store our result
      cachedQuestionIDs.push(result);

      // Start next iteration of the loop
      return callback();
    });
  }, function(err) {
    // Done with all questions. Pass question ID's to next function
    return callback(null, cachedQuestionIDs);
  });
}

我终于让它正常工作了,使用嵌套的 forEachSeries 循环来解决问题和答案的更优雅的解决方案。这里没有错误处理。只是为了展示基本思想。这是瀑布中的第二个函数。

function(quizID, callback) {

        async.forEachSeries(json.questions, function(question, callback) {
            db.registerQuestion(question, quizID, function(err, result) {
                async.forEachSeries(question.answers, function(answer, callback) {
                   db.registerAnswer(answer, result[0][''], callback); 
                }, function() {
                    callback();
                });
            });
        }, function() {
            callback();
        });

}