为模糊的标题道歉 - 我想不出一种简洁地总结这个问题的方法。
这是交易。我有一个 Node 控制器,它必须执行一些顺序数据库操作,如下所示:
0. Given a surveyId
1. Find all entries in the question table, where question.surveyId = surveyId.
2. For each row in the question table returned by the previous query:
a) Find all entries in the `answer` table, where answer.questionId = question.id
b) For each row in the answer table returned by the previous query:
(i) Find the count of all entries in the vote table where vote.answerId = answer.id
控制器需要返回一个对象,其中包含每个 answerId 在投票表中存在条目的次数的计数。它看起来像{1:9, 2:21, 3:0}
,其中 1、2、3 是答案 ID,9、21 和 0 是投票表中具有该答案 ID 的行数。
我一直在使用 Q 库来避免真正深度嵌套的回调。我有一个 runQuery 实用程序方法,它返回一个承诺并在数据库 IO 完成时解决它。
现在,我有一些看起来像:
runQuery("find questions with surveyid matching given surveyid")
.then({
"for each question row returned by query:"
runQuery("find answers with questionid matching this question row")
.then({
"for each answer row returned by query:"
runQuery("find votes with answerID matching this answer row")
.then({
"for each vote row"
"increment the count for this answerid in the return object"
})
})
})
问题是,当控制器返回时,返回对象总是空的,因为没有足够的时间来完成所有数据库操作并解决承诺(至少,我认为这是问题所在 - 显然很难解决这些异步承诺之类的问题。)
有没有更好的方法来做到这一点?我应该放弃 Q 并处理一堆嵌套回调吗?