2017-09-26 129 views
1

我對承諾的總數爲n00b,並希望更多地使用它們,但需要一點幫助。正確在for循環中使用Javascript承諾

for (var key in list){ 
    DoSomething(list[key]) 
     .then(function(){ 
      console.log(key); 
     }); 
} 

function DoSomething(item){ 
    return new Promise(function(resolve, reject){ 
     resolve(); 
    }); 
} 

console.log(key)部分不會工作,因爲變量key在外側範圍改性:取代碼下面的示例。一種解決方法可能是resolve承諾key值,但不幸的是,DoSomething方法是共享庫的一部分。

for (var key in list){ 
    DoSomething(list[key], key) 
     .then(function(key){ 
      console.log(key); 
     }); 
} 

function DoSomething(item, key){ 
    return new Promise(function(resolve, reject){ 
     resolve(key); 
    }); 
} 

是否有任何其他方式讓for循環console.log(key)正常工作?

+1

... –

回答

2

使用讓,而不是變種,它會用 「讓」 應該做的工作工作

let list = {a:1, b:2}; 
 

 
for (let key in list){ 
 
    DoSomething(list[key]) 
 
     .then(function(){ 
 
      console.log(key); 
 
     }); 
 
} 
 

 
function DoSomething(item){ 
 
    return new Promise(function(resolve, reject){ 
 
     resolve(); 
 
    }); 
 
}

+0

請投票明確重複,而不是回答他們。 – Cerbrus

+0

@Cerbrus你確定你指定了正確的重複? –

+0

@GiorgiMoniava:也許不是最好的,但它確實回答了這個問題。 – Cerbrus

1

使用IIFE

for (var key in list){ 
    (function(key){ 
     DoSomething(list[key]) 
     .then(function(){ 
      console.log(key); 
     }); 
    })(key); 
} 
+0

@Downvoter - 原因請 – nikhil

+0

由於OP已經使用Promises,___讓___建議一些比IIFE更現代的方法。此外,請對明顯的重複項目進行近距離投票,而不是回答它們。 – Cerbrus

+0

@Cerbrus - 爲此我希望有es6標籤。 – nikhil