How to use the axios library with AngularJS
Asked Answered
W

1

5

Why axios callback changes are displayed in angularjs, without using $apply

I was trying axios library on angularjs and I was surprised when I saw that the changes to $scope in the axios callback were detected by angular. I thought I had to call $apply like, for example, when you use setTimeout.

  // axios example
  axios.get(url).then((response) => {
    // Here I don't need $apply, why??
    $scope.axiosResult = response.data;
  });


  // setTimeout example
  setTimeout(() => {
    // Here I need $apply for the timeoutResult to appear on the HTML
    $scope.$apply(() => $scope.timeoutResult = {message: "timeout!"});
  }, 2000)

Do you know why $apply is not needed in axios?

EDIT:

A comment by georgeawg helped me see that I was using $http on another place, so I guess the digest cycle triggered by $http is helping axios callback to be "digested" too.

Warren answered 2/10, 2017 at 7:55 Comment(2)
I never use $apply, and I use a bunch of 3rd party AngularJS modules. Did you try $timeout (AngularJS) instead of setTimeout?Wiburg
My question was specifically why axios callback is participating in data-binding although I'm not using $q or $apply. I think I'm missing something about how angularjs works...Warren
K
8

How to use the axios library with AngularJS

Bring its ES6 promises into the AngularJS context using $q.when:

  // axios example
  ̶a̶x̶i̶o̶s̶.̶g̶e̶t̶(̶u̶r̶l̶)̶.̶t̶h̶e̶n̶(̶(̶r̶e̶s̶p̶o̶n̶s̶e̶)̶ ̶=̶>̶ ̶{̶
  $q.when(axios.get(url)).then((response) => {
    $scope.axiosResult = response.data;
  });

Only operations which are applied in the AngularJS execution context will benefit from AngularJS data-binding, exception handling, property watching, etc.

Also use the $timeout service instead of setTimeout.

  $timeout(() => {
    $scope.timeoutResult = {message: "timeout!"});
  }, 2000)

The $timeout service is integrated with the AngularJS framework and its digest cycle.

Kathline answered 2/10, 2017 at 9:10 Comment(3)
Thank you! Although my question was specifically why axios callback is participating in data-binding although I'm not using $q or $apply.Warren
You have not provided enough information to reproduce your results. I suspect something else in your code of which you are not aware is causing a digest cycle and the subsequent data binding.Kathline
Oh, I see! It's because I'm using $http on another place, and I guess the digest cycle triggered by $http is helping axios callback to be "digested" too. Thanks!Warren

© 2022 - 2024 — McMap. All rights reserved.