我在控制器中有这些代码,使用$ 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服务消耗尚未完成,尽管使用此方法。有人可以帮帮我吗?感谢。
答案 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
}