我试图在for循环中调用一个承诺。我需要呼叫才能得到相关的循环项目。我读了一些关于它的文章,但似乎仍然找不出正确的方法。
var params;
var identifylayers =["parcels", "lots", "gasstation"];
for (i = 0; i < identifylayers.length; i++)
{
lname = identifylayers[i];
govmap.intersectFeatures()
.then(function (e)
{
alert( lname);
});
}运行功能返回:加油站,加油站,加油站
我要它还回来:包裹,很多,加油站
我做错了什么?
发布于 2018-08-30 09:05:36
隐藏在代码中的是异步魔鬼JavaScript。: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);
}这利用了变量的功能范围和闭包思想的好处。用谷歌搜索更多信息。
它也被称为友化闭包,我只是编了这个:D
干杯!
发布于 2018-08-30 08:56:53
在循环中定义lname。当前,每个迭代都是相同的实例,因此它会被覆盖,然后承诺每次解析并打印最后一次覆盖。
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);
});
}
https://stackoverflow.com/questions/52078349
复制相似问题