代码的运行顺序与预期不同

时间:2016-10-21 12:47:58

标签: angularjs

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在第一个之前执行,如何修复?

5 个答案:

答案 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上查看有角度的公会。