【发布时间】:2019-08-17 18:31:07
【问题描述】:
我对 Node js 很陌生,异步编程对我来说似乎很难掌握。我正在使用 Promise-mysql 使流程同步,但我在 Promise 链中遇到了 for 循环的障碍
我有一个选择题模块。一个表存储所有 mcq 问题,另一个存储问题的所有相关选项。我使用第一个查询的输出作为第二个查询的输入,所以我承诺如下链接
var mcqAll=[]
var sql_test_q_ans='select qId, q_text from questions'
con.query(sql_test_q_ans)
.then((result)=>{
for(var i=0; i<result.length; i++)
{
ques=result[i]
var sql_test_q_ops='SELECT op_text, op_id FROM mc_ops WHERE
q_id='+result[i].q_id
con.query(sql_test_q_ops)
.then((resultOps)=>{
mcqAll.push({i: ques, ops: resultOps})
console.log(mcqAll)
})
}
})
我正在尝试创建一个看起来像这样的 javascript 对象数组
[{q_text:'How many states in USA', q_ops:{1:25, 2:35, 3:45, 4:50}}
{question2 and its options}
{question3 and its options}....
]
当我运行上述代码时,该对象会正确填充所有问题的选项,但在所有问题的所有 q_text 中都会重复相同的问题。
[ { q_text: 'No of states in USA',
[ {op_text: '25', mc_op_id: 113 },
{ op_text: '35', mc_op_id: 114 },
{ op_text: '45', mc_op_id: 115 },
{ op_text: '50', mc_op_id: 116}],
{ q_text: 'No of states in USA',
[ {op_text: 'A', mc_op_id: 1 },
{ op_text: 'B', mc_op_id: 2 },
{ op_text: 'C', mc_op_id: 3 },
{ op_text: 'D', mc_op_id: 4}],
{ q_text: 'No of states in USA',
[ {op_text: 'Yes', mc_op_id: 31 },
{ op_text: 'No', mc_op_id: 32 },
{ op_text: 'No sure', mc_op_id: 33 },
{ op_text: 'Might be', mc_op_id: 34}]
]
我觉得这与异步流程有关,因为在第二个查询之后打印任何内容之前,console.log 在第二个查询之后打印任何内容之前全部打印。任何见解将不胜感激
编辑:我添加了一个示例输出以便更好地理解。如输出所示,选项更改并存储在 for 循环中的 js 对象中,但所有对象的问题都更新为 for 循环中的最后一个问题
【问题讨论】:
-
将 var i 更改为 let i 因为 var 是函数作用域,因此 for 循环中的所有内容都将共享相同的 i 并且您在内部有异步调用循环,所以循环首先完成,然后事件循环将开始解析异步调用,因为循环已经完成,所以 i 的值将是数组的长度,将用于所有异步调用
-
您能否添加一个错误的输出,以便更好地了解复制的数据是什么?
-
@ManuelSpigolon 添加了示例输出
-
@AZ_,我试过 let i 但没什么区别
标签: javascript node.js asynchronous promise