2016-05-23 235 views
1

我想知道爲什麼我會在Angular2 (TypeScript)中使用For循環得到奇怪的行爲。我做了這個循環For循環無法正常工作(Angular2)

loadAllQuestions() { 

      this.questionService.loadAllQuestions() 
       .map(res=>res.json()) 
       .subscribe(res=>{ 
        this.listQuestion = res.questions; 
        for (var q in this.listQuestion){ 
         this.propositionService.findPropositionByQuestion(this.listQuestion[q].wordingQ) 
          .map(res=>res.json()) 
          .subscribe(res=>{ 
           console.log(this.listQuestion[q]); 
          }); 
        } 
      }); 
    } 

所以,每Question(在listQuestion)我叫使用它的措辭(wordingQ)服務將找到這個問題的所有命題(findPropositionByQuestion);問題是,它似乎循環不工作,當使console.log(this.listQuestion[q])它只展示listQuestion中的最後一個問題與listQuestion中索引的數目一樣多(所以如果我有3個問題,它顯示我最後一個問題3次等等。)。 詳細闡釋:在這裏,我有2個問題加載:

enter image description here

這裏什麼的console.log是我展示:

enter image description here

任何幫助嗎?

+1

[臭名昭著的Javascript循環問題?(http://stackoverflow.com/questions/1451009/javascript-infamous-loop-issue) –

回答

1

你需要一個額外的方法來分割你的代碼:

loadAllQuestions() { 
    this.questionService.loadAllQuestions() 
    .map(res => res.json()) 
    .subscribe(res => { 
     this.listQuestion = res.questions; 
     for (var q in this.listQuestion) { 
     this.findProposition(this.listQuestion[q]); 
     } 
    }; 
} 

findProposition(question) {       
    this.propositionService.findPropositionByQuestion(
    question.wordingQ) 
     .map(res => res.json()) 
     .subscribe(res => { 
     console.log(question); 
     console.log(res); 
     }); 
} 

這個問題可以幫助你理解爲什麼你有幾次跟蹤顯示相同的元素:

1

我建議你試試for (var q of this.listQuestion){...}而不是for (var q in this.listQuestion){...}

+0

沒有工作,但由於可能的重複無妨;) –

2

您可以使用let關鍵字使q變量塊作用域。

for (let q in this.listQuestion){ //var --> let 
    this.propositionService 
     .findPropositionByQuestion(this.listQuestion[q].wordingQ) 
     .map(res=>res.json()) 
     .subscribe(res=>{ 
      console.log(this.listQuestion[q]); 
     }); 
} 
+0

這需要Emascript 6或更高版本,感謝無論如何:) –

+0

@Selem喜歡如果箭頭功能不:)你仍然使用打字稿。它不處理讓你變成var變換嗎? –

+0

https://www.typescriptlang.org/play/#src=for%20(let%20q%20in%20obj)%7B%0D%0A%20%20%20%20doSomethingAsync(res%3D%3E%7B %0D%0A%20%20%20%20%20%20%20%20%20%20%20%20obj%件5bq%5D%0D%0A%20%20%20%20%7D)%3B% 0D%0A%7D –