2017-06-13 46 views
0

第一個控制檯日誌:0,如預期。 第二個控制檯日誌:1. 爲什麼在循環結束之前索引增加了?爲什麼索引像這樣遞增? javascript

for (var i = 0; i < this.offlineTimeSlots.length; i++) { 

      console.log(i); 

      this.http.post('http://localhost:63203/api', JSON.stringify(this.offlineTimeSlots[i]), { headers: headers }) 
      .map(res => res.json()) 
      .subscribe(data => { 

       console.log(i); 

       resolve(data); 
      }, (err) => { 
       reject(err); 
      }); 
     } 
+1

因爲異步代碼是異步 –

+0

這些都是異步調用...所以你的外在的console.log是獨立的內部一個 – harishr

回答

0

this.http.post是異步函數,因此將分別

執行For循環將繼續執行,它不依賴於this.http.post

概念被稱爲事件循環:Please read this

+0

所以如何使其正常工作? – ChristoK

+0

你想實現什麼? –

1

當你裏面的一個操作的如HTTP請求的,基本上你產生this.offlineTimeSlots.length(異步)循環。根據循環的長度,通常for循環幾乎每次都在http請求之前完成循環。

看看這個例子:

for(var i = 0; i < 10; i++){ 
    console.log(i); 
    setTimeout(()=>{ 
     console.log(i); 
    },2000); 
} 

這將在0至10(10除外)打印數,然後打印10,十次。原因是你在循環時創建了10個(循環的長度)異步請求。並且由於for循環將比2秒更快完成遍歷,所以i將在時間setTimeout開始時爲9 + 1(後增量)。

來源小提琴:https://jsfiddle.net/echonax/c9p4e19o/