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

时间:2016-02-12 15:23:10

标签: javascript node.js asynchronous async.js

在过去的几天里,我一直试图完成跟进,而我却无法解决问题。我觉得我已经尝试了一切。所以这里......

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

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

  • 将新测验保存到数据库,并将从数据库返回的新测验ID传递给下一个瀑布函数

  • 循环完成每个问题。缓存从DB返回的新问题ID,并将它们传递给下一个瀑布函数。这里的问题是缓存ID。由于该函数是异步的,我无法将结果缓存到下一个函数中使用的任何位置......

  • 循环显示每个答案,并将其保存到DB

这就是我所拥有的:

import re
[line for line in open('file.txt') if re.match(r'f\(\s*([^,]+)\s*,\s*([^,]+)\s*\)',line)]

2 个答案:

答案 0 :(得分:2)

只需将值存储在async.forEachSeries()之外的数组中,但存储在async.waterfall()控制流中的包装第二个函数内。然后,当async.forEachSeries()执行完毕后,您可以返回此数组。

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

答案 1 :(得分:1)

我终于让它正常工作,使用嵌套的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();
        });

}