JavaScript - 减慢循环速度

时间:2017-02-11 10:09:51

标签: javascript jquery angularjs timeout settimeout

我在控制器中有这些代码,使用$ http get调用webservice来检索一些数据。以下是代码:

更新代码

   var boolGetBoothCoords = false;
      BoothDesignatedCoordsService.getBoothDesignatedCoords(strListShortListedBooth[i], 3)

 .then(function(response) {
        var data = response.data
        console.log('data', data.arrBoothDesignatedCoords)
        boothDesignatedCoords = data.arrBoothDesignatedCoords;
        boolGetBoothCoords = true;
})

console.log("boothDesignatedCoords ", boothDesignatedCoords ); // undefined
// And a lot of other codes

但是,由于$ http get是异步方法,程序将立即调用控制台日志和代码,并且未定义boothDesignatedCoords。我不要那个。我希望程序仅在Web服务消耗完成后调用控制台日志和代码。所以我使用这个答案做了以下几点:how to slow down a javascript loop

    go();
    function go() {
        console.log("hello");

        if (boolGetBoothCoords == false) {
            setTimeout(go, 1000);

        }
        else
        {

        }
    }
    go()

   console.log("boothDesignatedCoords ", boothDesignatedCoords ); // undefined
   // OTHER CODES that uses variable boothDesignatedCoords will be undefined     as well

但是,我不知道为什么它仍会调用控制台日志,但Web服务消耗尚未完成,尽管使用此方法。有人可以帮帮我吗?感谢。

2 个答案:

答案 0 :(得分:1)

setTimeout是异步的,所以实际上你调用go函数并没有什么不同。

将会发生什么:

  • 致电go()功能
  • 在函数内调用setTimeout - 将安排go调用(大致)1s
  • 在此之后立即致电console.log

您可能想要的是将console.log放入then回调中:



var boolGetBoothCoords = false;
BoothDesignatedCoordsService.getBoothDesignatedCoords(strListShortListedBooth[i], 3)
  .then(function(response) {
    return response.data.arrBoothDesignatedCoords;
  })
  .then(function(boothDesignatedCoords) {
    console.log("boothDesignatedCoords ", boothDesignatedCoords );
  });




另一个选项(不推荐)是将console.log放入else函数中if语句的go部分。

在这种情况下,您还应该在整个代码段之前定义boothDesignatedCoords

答案 1 :(得分:1)

应该在响应之后调用假定在响应之后运行的代码。

var boolGetBoothCoords = false;

BoothDesignatedCoordsService.getBoothDesignatedCoords(
    strListShortListedBooth[i], 3)

.then(function(response) {
    var data = response.data
    console.log('data', data.arrBoothDesignatedCoords)
    boothDesignatedCoords = data.arrBoothDesignatedCoords;
    boolGetBoothCoords = true;
    codeThatUsesTheResponseData();
});
function codeThatUsesTheResponseData() {
    console.log("boothDesignatedCoords ", boothDesignatedCoords ); // undefined
    // And a lot of other codes
}