如何处理循环和承诺?
我在循环中使用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 */