JS
UISearchBar
第一个<script type="application/javascript">
var app = angular.module("app", []);
app.controller("AppCtrl", function ($scope, $http) {
$scope.data = [];
$http.get("{{ url_for('data') }}")
.then(function (result) {
$scope.data = result.data;
console.log(result.data); //first
});
console.log($scope.data); //second
...
</script>
返回正确的数据(带有一个项目的数组),第二个返回空数组。
请注意,执行顺序不是代码:
控制台
console.log
为什么第二个console.log在第一个之前执行,如何修复?
答案 0 :(得分:4)
因为http.get
是异步的,即它会在另一个线程上执行某些操作,而程序的其余部分会继续执行。当它完成并完成console.log
时,'第二个'console.log
已经运行。
答案 1 :(得分:2)
对$http.get
的调用是异步的,因此您无需预先了解需要多长时间。 console.log($scope.data)
将在$http.get
请求后立即执行,因为请求仍在处理并等待返回。
如果要在请求完成后执行逻辑,可以在then()
内添加其他逻辑,然后在需要执行其他请求时将其链接起来。例如,
$http
.get("{{ url_for('data') }}")
.then(function (result) {
$scope.data = result.data;
// do more things
return $http.get('foo/bar')
}).then(function (fooBar) {
// $scope.foo = bar;
});
所有$http
次调用都会返回一个承诺,因此您可以利用$q服务来促进任何承诺特定功能。
答案 2 :(得分:1)
Angular的$ http方法以异步方式运行。这意味着 console.log($ scope.data); 将首先被激活, console.log(result.data)在之后当$ http的承诺解决时,将被罚款。
答案 3 :(得分:0)
$ http是将异步执行的服务
答案 4 :(得分:0)
这是因为Angular的JavaScript以异步方式运行。这意味着即使它正在等待另一项任务,它仍会继续运行。你应该在Promises上查看有角度的公会。