我正在尝试在for循环中调用promise。我需要调用才能获得相关的循环项。我读了一点,但似乎仍然找不到正确的方法。
var params;
var identifylayers =["parcels", "lots", "gasstation"];
for (i = 0; i < identifylayers.length; i++)
{
lname = identifylayers[i];
govmap.intersectFeatures()
.then(function (e)
{
alert( lname);
});
}
运行函数返回:加油站,加油站,加油站
我希望它退回:包裹,地段,加油站
我在做什么错了?
答案 0 :(得分:0)
它隐藏在代码中的 async 恶魔。 :D
像这样观察它-
promise call
(这里是-intersectFeatures().then(fn (){})
),它就会知道此调用将最终完成,因此程序流将永远不会尝试执行此时,传递给.then()
的回调会使其保持安全,并提醒您intersectFeatures
完成后,它需要执行传递给.then()
的回调。.then(callback)
将如何访问lname
。通过关闭。所以.then(callback)
目前不会立即执行。 因此,到那时.then(callback)
将被执行,您的循环将已经完成,并且在迭代结束时,lname将保留加油站。因此,您的.then(callback)
仅打印加油站 解决方案:
这是一个非常老的JS解决方案,它迭代异步代码并仍然使用闭包确保正确的变量访问-
for (i = 0; i < identifylayers.length; i++)
{
lname = identifylayers[i];
(function (lname) {
govmap.intersectFeatures()
.then( function () {
alert(lname);
} )
})(lname);
}
这利用了变量的功能范围和闭包概念的好处。在Google上查找更多信息。
它也被称为与朋友闭包,我刚刚做了:D
干杯!
答案 1 :(得分:-1)
在循环中定义lname
。当前,每次迭代都是相同的实例,因此它会被覆盖,然后Promise会解析并每次打印最后的覆盖。
const lname = identifylayers[i];
在异步代码运行之前它将被覆盖。
async function intersectFeatures() {
return "OK"
}
var params;
var identifylayers = ["parcels", "lots", "gasstation"];
for (let i = 0; i < identifylayers.length; i++) {
const lname = identifylayers[i];
intersectFeatures()
.then(function(e) {
alert(lname);
});
}