如何处理循环和承诺?

我在循环中使用Promised。

我试图做一个循环,但迭代器(当然)与循环改变。

let fctPromise = (i) => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(true + "//" + i) }, parseInt(i) * 1000) }); } var arr = [5, 3, 4, 2, 1]; for (var i of arr) { fctPromise(i).then(value => console.log(value, "////", i)) } 

循环正常工作,它通过数组。 但是i正在改变我应该改变我正在接受的方式吗?

 let fctPromise = (i) => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(true + "//" + i) }, parseInt(i) * 1000) }); } var arr = [5, 3, 4, 2, 1]; for (let i of arr) { fctPromise(i).then(value => console.log(value, "////", i)) } 

https://jsfiddle.net/2fdk6err/1/

而不是使用

变种我arr

使用

让我的arr

所以我只是改变这部分代码:

  for (var lang of language) 

  for (let lang of language) 

让是新的变种!

诺言解决后的langvariables是变化。 所以我认为你应该保持朗变数和承诺的决心。

 let iterateOnJson = (jsonObj, originLanguage, TargetLanguage) => { var promiseAll = []; let jsonObjClone = merge.mergeDeep({}, jsonObj); let iterateInner = (jsonObj) => { for (let item in jsonObj) { if (typeof(jsonObj[item]) == "string") { let promise = translateIt(jsonObj[item], originLanguage, TargetLanguage).then(translatedWord => jsonObj[item] = JSON.parse(translatedWord).translationText); promiseAll.push(promise); } else { iterateInner(jsonObj[item]) } } } iterateInner(jsonObjClone); return Promise.all(promiseAll).then(data => { return { jsonObjClone: jsonObjClone, lang: TargetLanguage }; }); } //HERE IS THE LOOP for (var lang of language) { console.log(lang); iterateOnJson(translateFile, "fr", lang).then(value => { let fileTitle = value.lang; fs.writeFile("mypath/" + fileTitle + i + ".json", JSON.stringify(value.jsonObjClone), function(err) { if (err) { return console.log(err); } console.log("The file was saved!", value.lang); }); }); } 

如果我理解你的话,试着使用Promise.all():

 let fctPromise = (i) => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(true + "//" + i) }, parseInt(i) * 1000) }); } var arr = [5, 3, 4, 2, 1]; Promise.all(arr.map(i=>{ return fctPromise(i).then(value => console.log(value, "////", i)) })); 

请不要使用var而是像这样使用const

 for (const i of arr) {...} 
 let fctPromise = (i) => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(true + "//" + i) }, parseInt(i) * 1000) }); } var arr = [5, 3, 4, 2, 1]; for (const i of arr) { fctPromise(i).then(value => console.log(value, "////", i)) } /* print true//1 //// 1 true//2 //// 2 true//3 //// 3 true//4 //// 4 true//5 //// 5 */