当前位置:  开发笔记 > 编程语言 > 正文

是否有可能在另一个请求中有一个Angular js $ http请求?

如何解决《是否有可能在另一个请求中有一个Angularjs$http请求?》经验,为你挑选了1个好方法。

我正在尝试发送请求AngularJS以获取用户注册的令牌.一旦我获得令牌,我将使用令牌发送另一个请求来注册用户.

但是第一个请求有效,我得到令牌,但第二个请求不起作用.

facebookExample.controller('registerController', function($scope, $http, $localStorage, $location) {
  $scope.data = {};
  $scope.getToken = function() {
      $http.post('http://you-serve.org/api.php?action=createaccount&format=json&name=' + $scope.data.username + '&email=' + $scope.data.email + '&realname=' +
        $scope.data.firstname + ' ' + $scope.data.lastname +
        '&mailpassword=false&reason=Fun_and_profit&language=en&token').then(
        function(response) {
          return response.data.createaccount.token;
        }
        // End success
        ,
        function() {
          alert('error');
        } // End error 
      ); //End then
    } // End getToken

  $scope.register = function(myToken) {
      $http.post('http://you-serve.org/api.php?    action=createaccount&format=json&name=' +
        $scope.data.username + '&email=' +
        $scope.data.email + '&realname=' +
        $scope.data.firstname + ' ' +
        $scope.data.lastname +
        '&mailpassword=false&reason=Fun_and_profit&language=en&token=' + myToken).then(
        function(response) {
          alert("Registration successful !  You can log in now " + response.data.createaccount.username);
        },
        function(response) {
          alert(response.data.error.info);
        }); //End then
    } //End register


  $scope.signup = function() {
      register(getToken);
    } // End sign up
}); // End controller



  
    

谁知道我怎么能这样做?



1> Ionut Costic..:

您可以使用promise1.then(promise2)链接promises($ http返回的内容).

因此,在您的情况下,链接getToken和注册的正确方法是:

$scope.getToken().then($scope.register)

(修改两个函数后返回 $ http调用)

编辑:(进一步说明)

你要做的是被称为承诺链.实际上,按顺序执行两个或多个异步操作.来自html5rocks承诺教程:

排队异步操作

您还可以链接"然后"以按顺序运行异步操作.

当你从"then"回调中返回一些东西时,它有点神奇.如果返回一个值,则使用该值调用下一个"then".但是,如果你返回类似promise的东西,那么下一个"then"就会等待它,并且只有当这个承诺解决时才会被调用(成功/失败).

它的工作方式是当你从函数Promise.then()函数返回一个值时,然后用函数的返回值.then()或者分辨率调用链中的下一个函数Promise,如果返回值为a Promise,则链然后在Promise继续之前等待此解决.

因此(并记住比$ http返回一个Promise对象):

function a() {
    return $http.get('...').then(function (response) { return response.data; });
}

function b(data) {
    return $http.get('...'+data).then(function (response) { return response.data; });
}

要将两个函数链接在一起,以便b()使用结果调用a(),只需执行以下操作:

a().then(b)

请阅读s上的教程,Promise以便更好地处理它们的工作方式.它们是JavaScript使异步操作更容易处理的最佳工具之一.

PS:在您的具体情况下,代码将是:

facebookExample.controller('registerController', function($scope, $http, $localStorage, $location) {
  $scope.data = {};

  function getToken() {
    return $http.post('http://you-serve.org/api.php?action=createaccount&format=json&name=' + $scope.data.username + '&email=' + $scope.data.email + '&realname=' + $scope.data.firstname + ' ' + $scope.data.lastname + '&mailpassword=false&reason=Fun_and_profit&language=en&token')
      .then(
        function(response) {
          return response.data.createaccount.token;
        },
        // End success
        function() {
          alert('error');
        } // End error 
      ); //End then
  } // End getToken

  function register(myToken) {
    return $http.post('http://you-serve.org/api.php?action=createaccount&format=json&name=' +
        $scope.data.username + '&email=' +
        $scope.data.email + '&realname=' +
        $scope.data.firstname + ' ' +
        $scope.data.lastname +
        '&mailpassword=false&reason=Fun_and_profit&language=en&token=' + myToken)
      .then(
        function(response) {
          alert("Registration successful !  You can log in now " + response.data.createaccount.username);
        },
        function(response) {
          alert(response.data.error.info);
        }
      ); //End then
  } //End register


  $scope.signup = function() {
    getToken().then(register);
  } // End sign up
}); // End controller

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有