在过去的几天里,我一直试图完成跟进,而我却无法解决问题。我觉得我已经尝试了一切。所以这里......
我的路线被赋予一个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)]
答案 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();
});
}