2017-08-06 46 views
2

我有一個關於JS中Promises的常見問題。 我無法找到答案的解決方案,最後決定在這裏問。Promise中的代碼是指循環迭代中的變量

那麼讓我們來看看下面的僞代碼:

for (var i = 0; i < 10000; i++) { 
    some_promise(function(){ 
     console.log(i); 

     // Would this i return the value of some_promise point of execution, 
     // or at the current iteration when it is triggered? 
    }); 
} 

如果我們看一下第一次迭代和承諾被觸發,那會是0還是讓我們說1000(迭代移動的同時等待承諾)

這將是如果你能幫助我總結我的頭周圍真正有用的..

+2

爲什麼不自己嘗試一下? 「some_promise」做了什麼?看起來這與承諾無關。 – PeterMader

+2

這取決於是否some_promise火災immeadiately或不。 –

回答

2

let情況下的console.log將火10000次,它的一個將在循環i值。

例子:

const fun = function(){ 

    var promise = new Promise(resolve => { 
    setTimeout(resolve, 2000); 
    }) 

    for(let i=0; i<1000; i++){ 
    promise.then(() => console.log(i)); 
    } 

} 

如果使用var的執行console.log將觸發10000印刷10000爲值:

const fun = function(){ 

    var promise = new Promise(resolve => { 
    setTimeout(resolve, 2000); 
    }) 

    for(var i=0; i<1000; i++){ 
    promise.then(() => console.log(i)); 
    } 

} 

這是因爲VAR的範圍限定到最近的功能塊,讓被作用域到最近的封閉塊,你的循環是同步的,並且在承諾解決之前至少會觸發「打勾」。

+0

謝謝!這實際上很煩人,因爲我沒有辦法在我的承諾中使用索引......謝謝反正! :) –

+0

@CrypticPug :)) –