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

Angularjs 代码的运行顺序与预期不同,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') }}")

JS

<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秒?永远不会完成的?那你怎么办。