如何为每个周期将参数传递给JavaScript中的promise函数
我有文档元素的列表。我想用html更改元素的outerHtml。HTML是从循环中的文件加载的,所以我使用承诺。问题在于在循环中将元素传递给promise函数,因为只传递数组中的最后一个元素如何为每个周期将参数传递给JavaScript中的promise函数,javascript,Javascript,我有文档元素的列表。我想用html更改元素的outerHtml。HTML是从循环中的文件加载的,所以我使用承诺。问题在于在循环中将元素传递给promise函数,因为只传递数组中的最后一个元素 ... /** * Set outer html of element. * @param element * @param newHtml */ setOuterHtml = function(element, newHtml){ console.log("ELEMENT ",
...
/**
* Set outer html of element.
* @param element
* @param newHtml
*/
setOuterHtml = function(element, newHtml){
console.log("ELEMENT ", element); // always <ge-test-2></ge-test-2>
element.outerHTML = newHtml;
}
this.loadElementsToHtml = function(){
console.log(this.elements);
//[ge-survey, ge-test-1, ge-test-2]
var promises = [];
for(var i=0; i<this.elements.length; i++){
var el = this.elements[i];
// laod html from file
var elPromise = this.loadHtml(el);
// set outer html when HTML is loaded
//// problem here with el !!! always ge-test-2 element
elPromise.then(res => setOuterHtml(el,res));
promises.push(elPromise);
}
return Promise.all(promises);
}
。。。
/**
*设置元素的外部html。
*@param元素
*@param newHtml
*/
setOuterHtml=函数(元素,newHtml){
console.log(“ELEMENT”,ELEMENT);//始终
element.outerHTML=newHtml;
}
this.loadElementsToHtml=函数(){
console.log(this.elements);
//[ge调查,ge-test-1,ge-test-2]
var承诺=[];
对于(var i=0;i setOuterHtml(el,res));
承诺。推动(承诺);
}
返回承诺。全部(承诺);
}
您似乎已经在此中包含了元素。元素
,只需将该元素与其索引一起传递即可
this.loadElementsToHtml = function(){
console.log(this.elements);
var promises = [];
for(var i=0; i<this.elements.length; i++){
// laod html from file
var elPromise = this.loadHtml(this.elements[i]);
elPromise.then(res => setOuterHtml(this.elements[i], res));
promises.push(elPromise);
}
return Promise.all(promises);
}
this.loadElementsToHtml=function(){
console.log(this.elements);
var承诺=[];
对于(var i=0;i setOuterHtml(this.elements[i],res));
承诺。推动(承诺);
}
返回承诺。全部(承诺);
}
这里的问题似乎是el
变量在循环元素时发生变化,循环完成后,el
将引用数组中的最后一个元素
正确执行此操作的一种简单(更简洁)方法是使用.map()
,以便每个迭代都有自己的范围:
this.loadElementsToHtml = function(){
console.log(this.elements);
//[ge-survey, ge-test-1, ge-test-2]
return Promise.all(this.elements.map(el =>
this.loadHtml(el).then(res => setOuterHtml(el, res));
));
}
同一问题可能重复:所有闭包只共享一个
i
变量。