如何为每个周期将参数传递给JavaScript中的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 ",

我有文档元素的列表。我想用html更改元素的outerHtml。HTML是从循环中的文件加载的,所以我使用承诺。问题在于在循环中将元素传递给promise函数,因为只传递数组中的最后一个元素

 ...
 /**
 * 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
变量。