我尝试使用此循环执行很多查询:
buildQuestions()
{
for(var i = 0;i<this.sections.length;i++)
{
this.serviceQue.getQuestionsBySectionId(this.sections[i].section_id)
.subscribe(rt => this.sections[i].questions=rt,
er => console.log(er),
() => console.log("OK"));
}
}
问题在于,当订阅呼叫rt => this.sections [i] .questions = rt时,我没有相同的值,然后发送错误,因为对于某些i,this.sections [i]未定义。
例如,如果我有1个部分,而i开头为0,则它以i = 0调用this.serviceQue.getQuestionsBySectionId(this.sections [i] .section_id),但是.subscribe(rt => this)。 section [i] .questions = rt在i = 1下执行,我尝试使用此代码执行类似手动同步的操作:
buildQuestions()
{
var last = -1;
for(var i = 0;i<this.sections.length;)
{
if(last!=i)
{
last = i;
this.serviceQue.getQuestionsBySectionId(this.sections[i].section_id)
.subscribe(rt => this.sections[i].questions=rt,
er => console.log(er),
() => i++);
}
}
}
但是,出于某些奇怪的原因,当我这样做时,this.serviceQue.getQuestionsBySectionId(this.sections [i] .section_id) 如果我使用第一个代码,它永远不会发送响应并执行无限循环,但是如果我使用第二个代码,它永远不会发送响应。
有人可以帮助我吗?
答案 0 :(得分:2)
是的,这就是JS的工作方式。当执行回调时,循环已经完成,所以我将获得长度值。您必须将代码放在闭包中:
buildQuestions() {
this.sections.forEach(section => {
this.serviceQue.getQuestionsBySectionId(section.section_id)
.subscribe(rt => section.questions = rt,
er => console.log(er),
() => console.log("OK"));
}
});
}
有关此问题的更多信息:在这里,您对发生这种情况的原因进行了解释:https://hackernoon.com/how-to-use-javascript-closures-with-confidence-85cd1f841a6b
顺便说一句,这是一个经典的求职面试问题