Angularjs 代码的运行顺序与预期不同
JSAngularjs 代码的运行顺序与预期不同,angularjs,Angularjs,JS <script type="application/javascript"> var app = angular.module("app", []); app.controller("AppCtrl", function ($scope, $http) { $scope.data = []; $http.get("{{ url_for('data') }}")
<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之前执行,如何修复它?$http是将异步执行的服务$http是将异步执行的服务对
$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
调用都会返回一个承诺,因此您可以利用该服务来实现任何特定于承诺的功能。对$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
调用都会返回一个承诺,因此您可以利用该服务来实现任何特定于承诺的功能。因为http.get
是异步的,即它会在另一个线程上启动并执行某些操作,而程序的其余部分则会继续。当它完成时,它是console.log
,“第二个”console.log
已经运行了。因为http.get
是异步的,即它在另一个线程上启动并执行某些操作,而程序的其余部分继续。当它完成并进入console.log
时,“第二个”console.log
已经运行了。这是因为Angular的JavaScript是异步运行的。这意味着它将继续运行,即使它正在等待另一个任务。你应该查阅angular的工会关于承诺的信息 这是因为Angular的JavaScript是异步运行的。这意味着它将继续运行,即使它正在等待另一个任务。你应该查阅angular的工会关于承诺的信息 Angular的$http方法异步运行。这意味着console.log($scope.data)将首先被执行,并且中的控制台.log(result.data)将在$http的承诺解决时被执行。Angular的$http方法异步运行。这意味着console.log($scope.data)将首先被执行,并且内的控制台.log(result.data)将在$http的承诺解决时被执行。我如何才能使$http.get在其他任何事情之前被调用?您可以,如果您使用ngRoutePut在完成时运行的then函数中添加任何额外代码。@Kikapi我不是JS专家(希望这里有人能够回答这个问题),但是是否存在“waitForCompletion”标志的概念,即主线程将暂停,直到该函数完成?当然,在这里您必须非常小心——假设http请求需要30秒?永远不会完成的?那么你该怎么做。我如何才能使$http.get在其他任何事情之前被调用?如果你使用ngRoutePut,你可以在完成时运行的then函数中添加任何额外的代码。@Kikapi我不是JS专家(希望这里有人能够回答这个问题),但是有没有“waitForCompletion”标志的概念,主线程将暂停,直到该函数完成?当然,在这里您必须非常小心——假设http请求需要30秒?永远不会完成的?那你怎么办。