角度:Observable.subscribe取消同步怪异错误

时间:2018-06-29 06:29:32

标签: javascript angular typescript

我尝试使用此循环执行很多查询:

  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) 如果我使用第一个代码,它永远不会发送响应并执行无限循环,但是如果我使用第二个代码,它永远不会发送响应。

有人可以帮助我吗?

1 个答案:

答案 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

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