gpt4 book ai didi

javascript - Angular:Observable.subscribe 取消同步奇怪的错误

转载 作者:行者123 更新时间:2023-12-01 01:55:11 25 4
gpt4 key购买 nike

我尝试使用以下方法在循环中执行大量查询:

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

问题是,当 subscribe 调用 rt => this.sections[i].questions=rt 行时,i 没有相同的值,然后发送错误,因为对于某些 i,this.sections[i] 未定义。

例如,如果我有 1 个部分,并且开头的 i 为 0,则它会调用 this.serviceQue.getQuestionsBySectionId(this.sections[i].section_id),其中 i = 0,但 .subscribe(rt => this. sections[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)从不发送响应并执行无限循环,如果我使用第一个代码,它会发送响应,但如果我使用第二个代码,它永远不会发送响应。

有人可以帮助我吗?

最佳答案

是的,这正是 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

顺便说一下,这是一个经典的求职面试问题

关于javascript - Angular:Observable.subscribe 取消同步奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51095570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com