for循环内的promise问题

时间:2018-08-29 13:13:53

标签: javascript promise

我正在尝试在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);
    });

}

运行函数返回:加油站,加油站,加油站

我希望它退回:包裹,地段,加油站

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

它隐藏在代码中的 async 恶魔。 :D

像这样观察它-

  1. 您的程序流一旦遇到promise call(这里是-intersectFeatures().then(fn (){})),它就会知道此调用将最终完成,因此程序流将永远不会尝试执行此时,传递给.then()的回调会使其保持安全,并提醒您intersectFeatures完成后,它需要执行传递给.then()的回调。
  2. 接下来要注意的是.then(callback)将如何访问lname。通过关闭。所以
  3. 另一个需要注意的重要事情是,整个过程都在一个循环中。您的循环不知道其迭代的代码是同步的还是异步的。它的唯一任务是进行迭代。正如我们之前在 Point-1 中所提到的,.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);
    });

}