我在控制器中有这些代码,它们使用 $http 来调用 Web 服务来检索一些数据。下面是以下代码:
更新代码:
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
但是,由于 get $http 是异步方法,程序将立即调用控制台日志和代码,并且 boothDesignatedCoords 将未定义。我不想这样。我希望程序仅在 Web 服务使用完成后调用控制台日志和代码。所以我用这个答案做了以下事情:如何减慢javascript循环的速度:
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 服务消耗尚未完成。有人可以帮我吗?谢谢。
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
放在go
函数中if
语句的else
部分。
在这种情况下,还应在整个代码段之前定义boothDesignatedCoords
。
假定在响应之后运行的代码应在响应后调用。
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
}