结果如何从$ http传递到.onsuccess函数?

时间:2015-10-29 11:05:17

标签: angularjs

结果如何从$ http对象传递到成功执行的未命名函数?

$http
    .success(function (result) {
        ...
})

我知道结果是通过我放入函数的任何变量名传递的。它通常称为result。但这是怎么做到的?这对我来说似乎很神奇。

我希望写一些像:

$http
    .success(function (result=$http.result) {
        ...
})

5 个答案:

答案 0 :(得分:1)

Angular正在使用promise机制,它基本上会返回一个对象,让你知道结果何时可用或者抛出错误。

当ajax调用返回时,angular调用promise并将结果作为参数提供。

就像调用普通函数一样。

答案 1 :(得分:1)

$http允许您执行异步网络操作并返回一个promise对象(您可以在Angular here中阅读有关promises的更多信息)。

使用successerror方法来声明对解析(当请求成功完成时)或拒绝(当处理请求时出错时)发生的事情的回调。我使用了过去时态,因为它们现在已被弃用,并且处理这些的所需方法是使用promise对象的then方法。

// Simple GET request example:
$http({
  method: 'GET',
  url: '/someUrl'
}).then(function successCallback(response) {
    // this callback will be called asynchronously
    // when the response is available
  }, function errorCallback(response) {
    // called asynchronously if an error occurs
    // or server returns response with an error status.
  });

基本上,语法几乎相同 - successCallbackFunction与您在示例的success方法中传递的方法具有相同的签名。

但这只是方法签名。您可以根据需要调用回调函数参数(resultdata等)。您需要记住的是,回调函数中的第一个参数将是您的请求返回的数据。

答案 2 :(得分:1)

您必须研究 Javascript Function Paramters Promises 的工作方式。

我认为,您粘贴的代码来自某些AngularJS应用程序。

如果我的假设是正确的, $ http 是一项服务,并且没有任何成功方法。

成功方法出现在$ http方法:

//get, post, ecc...
$http.get(...).success()

顺便说一下:

  1. Javascript没有提供任何匹配参数的方法,它们的顺序始终是被叫方提供的顺序,而您使用的名称仅供您(Don't confuse with the IOC that the DependencyInjection in AngularJS does)使用。 示例1
  2. 
    
    function loggerCase1(log1, log2, log3, log4) {
      console.log('loggerCase1 => param-1:', log1);
      console.log('loggerCase1 => param-2:', log2);
      console.log('loggerCase1 => param-3:', log3);
      console.log('loggerCase1 => param-4:', log4);
      console.log('---------------------');
    };
    
    function loggerCase2(log4, log2, log1, log3) {
      console.log('loggerCase2 => param-1:', log4);
      console.log('loggerCase2 => param-2:', log2);
      console.log('loggerCase2 => param-3:', log1);
      console.log('loggerCase2 => param-4:', log3);
      console.log('---------------------');
    };
    function loggerCaseN() {
      for(var i = 0; i < arguments.length; i++) {
        console.log('loggerCaseN => param-' + (i + 1) + ': ', arguments[i]);
      }
      console.log('---------------------');
    };
    
    
    var logs = ['log1', 'log2', 'log3', 'log4'];
    
    loggerCase1.apply(this, logs);
    loggerCase2.apply(this, logs);
    loggerCaseN.apply(this, logs);
    &#13;
    &#13;
    &#13;

    如果在javascript中明确了解功能参数的行为......你会知道说第一个作为第二个 / em>或类似的东西,你粘贴的例子似乎与 default parameters 类似(在ES6中实现,又名Javascript Harmony)。

    让我们进入第2点:

    1. 在一个简单的承诺链中(在谷歌上查找或查看上面的链接),您可以使用return将结果传递给下一个回调。的 EXAMPLE2
    2. &#13;
      &#13;
      angular
        .module('promisechainging', [])
        .run(function($q) {
        
          $q
            .when('Hello World')
            .then(function(greetings) {
                console.log('ring 1', greetings);
      
                return greetings;
            })
            .then(function(salut) {
                console.log('ring 2', salut);
      
                return salut;
            })
            .then(function(ciao) {
                console.log('ring 3', ciao);
      
                return { message: ciao };
            })
            .then(function(result) {
                console.log('ring 4', result.message);
      
                return result;
            })
          
            .catch(function(error) {
                console.log('THIS LOG NEVER HAPPENS BECAUSE THERE AREN\'T REJECTED PROMISES');
      
                return $q.reject(error);
            })
            .finally(function() {
              console.log('We Are At The END');
            })
        ;
        
        })
      ;
      &#13;
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
      
      <div ng-app="promisechainging"></div>
      &#13;
      &#13;
      &#13;

      参数的命名基本上并不重要!

答案 3 :(得分:1)

$http
    .success(function (result) {
        ...
})

$http将返回Promise Object,这只是一个带有success和其他不同功能的Javascript对象。

因此,当$http被评估时,语句立即变为如下,

(Promise Object)
    .success(function (result) {
        ...
})

承诺的success函数将保存一旦承诺已解决,就会调用此匿名函数。我们可以手动解决承诺,但我想http会在这里为你做这件事。

一旦http请求(AJAX)成功,angular将告诉此Promise对象通过解析 Promise运行此成功函数,有点像:

suceess: function(responseData){ //success of AJAX
    resolve(responseData); //this will pass the result to promise
}

一旦resolve被称为promise对象,其中包含结果,它将调用您最初使用此结果值传递的成功函数。

PS:这是一个粗略的想法,我将调查Angular源以查看它们的实际实现。

答案 4 :(得分:0)

Javascript函数也是类对象。

当$ http完成时,它将调用成功或失败函数 - 它们是对象,因此可以传递它们。如果是,它将提供参数。