结果如何从$ http对象传递到成功执行的未命名函数?
$http
.success(function (result) {
...
})
我知道结果是通过我放入函数的任何变量名传递的。它通常称为result
。但这是怎么做到的?这对我来说似乎很神奇。
我希望写一些像:
$http
.success(function (result=$http.result) {
...
})
答案 0 :(得分:1)
Angular正在使用promise机制,它基本上会返回一个对象,让你知道结果何时可用或者抛出错误。
当ajax调用返回时,angular调用promise并将结果作为参数提供。
就像调用普通函数一样。
答案 1 :(得分:1)
$http
允许您执行异步网络操作并返回一个promise对象(您可以在Angular here中阅读有关promises的更多信息)。
使用success
和error
方法来声明对解析(当请求成功完成时)或拒绝(当处理请求时出错时)发生的事情的回调。我使用了过去时态,因为它们现在已被弃用,并且处理这些的所需方法是使用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
方法中传递的方法具有相同的签名。
但这只是方法签名。您可以根据需要调用回调函数参数(result
,data
等)。您需要记住的是,回调函数中的第一个参数将是您的请求返回的数据。
答案 2 :(得分:1)
您必须研究 Javascript Function Paramters 和 Promises 的工作方式。
我认为,您粘贴的代码来自某些AngularJS应用程序。
如果我的假设是正确的, $ http 是一项服务,并且没有任何成功方法。
成功方法出现在$ http方法:
//get, post, ecc...
$http.get(...).success()
顺便说一下:
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;
如果在javascript中明确了解功能参数的行为......你会知道说第一个作为第二个 / em>或类似的东西,你粘贴的例子似乎与 default parameters 类似(在ES6中实现,又名Javascript Harmony)。
让我们进入第2点:
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;
答案 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对象,其中包含结果,它将调用您最初使用此结果值传递的成功函数。
答案 4 :(得分:0)
Javascript函数也是类对象。
当$ http完成时,它将调用成功或失败函数 - 它们是对象,因此可以传递它们。如果是,它将提供参数。