Javascript Angularjs:控制器中的函数返回的变量为;“未定义”; angular.module('angularApp',['dialogs.main'])) .controller('TableController',函数(对话框,$http){ 函数getEmailAddress(){ var emailAddress=“empty”; $http({ //这里定义了http方法,该方法按预期工作 }).然后(功能成功(响应){ emailAddress=response.data; console.log(emailAddress+“:getEmailAddress success”);//从这个日志中,我可以看到我所期望的 return emailAddress;//但是,这不会返回可以在日志中看到的值。 //返回{ //emailAddress:emailAddress //};//这样也不行 },函数resendError(){ 返回“错误!”; }); }; this.resendConfirmationMail=函数(orderId){ //在这个函数中,将使用上面的函数。 }; });
我要做的是创建/使用一个函数,该函数返回一个值,该值来自http函数 如上所述,有两个函数,其中一个函数应该返回一个名为Javascript Angularjs:控制器中的函数返回的变量为;“未定义”; angular.module('angularApp',['dialogs.main'])) .controller('TableController',函数(对话框,$http){ 函数getEmailAddress(){ var emailAddress=“empty”; $http({ //这里定义了http方法,该方法按预期工作 }).然后(功能成功(响应){ emailAddress=response.data; console.log(emailAddress+“:getEmailAddress success”);//从这个日志中,我可以看到我所期望的 return emailAddress;//但是,这不会返回可以在日志中看到的值。 //返回{ //emailAddress:emailAddress //};//这样也不行 },函数resendError(){ 返回“错误!”; }); }; this.resendConfirmationMail=函数(orderId){ //在这个函数中,将使用上面的函数。 }; });,javascript,angularjs,Javascript,Angularjs,我要做的是创建/使用一个函数,该函数返回一个值,该值来自http函数 如上所述,有两个函数,其中一个函数应该返回一个名为emailAddress的变量,但返回的变量被描述为未定义的,甚至不是空的,作为其初始值 我可以从控制台.log中看到正确的返回值,但我不能只返回它 function test () { $http.get('url') .then(x => x.data); } var data = test(); 非常感谢您的建议。getEmailAddr
emailAddress
的变量,但返回的变量被描述为未定义的
,甚至不是空的
,作为其初始值
我可以从控制台.log中看到正确的返回值,但我不能只返回它
function test () {
$http.get('url')
.then(x => x.data);
}
var data = test();
非常感谢您的建议。
getEmailAddress
是一个异步函数(因为它使用的$http
也是异步的)。您可以从getEmailAddress
方法返回承诺,然后使用获取电子邮件地址:
<script type="text/javascript">
angular.module('angularApp', ['dialogs.main'])
.controller('TableController', function(dialogs, $http){
function getEmailAddress(){
var emailAddress ="empty";
$http({
//The http method is defined here, which works as expected
}).then(function succes(response) {
emailAddress = response.data;
console.log(emailAddress + " : getEmailAddress success");//From this log, I can see what I expected
return emailAddress; //However, this doesn't return the value, which can be seen in the log.
// return {
// emailAddress:emailAddress
// }; //This way doesn't work either
}, function resendError() {
return "Error!";
});
};
this.resendConfirmationMail = function(orderId){
//Inside this function, the function above is going to be used.
};
});
</script>
这可能有助于学习异步编程和
这是一个很好的答案,总结了异步函数的使用。就像您使用$http
一样
因此,它是异步的。我不太确定这是否是你想要做的,但我觉得最好的一点是,你不能返回一个值,并期望立即消费它。我的意思是这行不通:
function getEmailAddress() {
return $http({
//The http method is defined here, which works as expected
});
}
this.resendConfirmationMail = function (orderId) {
getEmailAddress().then(function (emailAddress) {
console.log(emailAddress);
});
};
您需要做的是返回一个承诺,然后注册说“在承诺解决时运行我的代码”。在这种情况下,一旦$http
请求返回,承诺将得到解决。正如$http
为您返回一个承诺一样,您所要做的就是返回它
function test () {
$http.get('url')
.then(x => x.data);
}
var data = test();
因此,在您的代码中,只需在$http
之前返回,您应该使用$q来返回承诺
function test () {
return $http.get('url')
.then(x => x.data);
}
test().then(data => {
//use data
});
您需要从$http
调用返回承诺,然后在需要值时必须使用.then()
来检索它
function getEmailAddress(){
var deferred = $q.defer();
var emailAddress ="empty";
$http({
//The http method is defined here, which works as expected
}).then(function (response) {
emailAddress = response.data;
console.log(emailAddress + " : getEmailAddress success");//From this log, I can see what I expected
deferred.resolve(emailAddress)
}, function () {
deferred.reject(""Error!")
});
return deferred.promise;
};
这里需要记住的重要一点是,$http
是异步运行的,因此您不能从中“返回值”并在代码中使用该值,除非该代码在中。然后()
或捕获()
成功或失败处理程序中,并且这些处理程序在以后才会运行。这里您的getEmailAddress函数不返回任何内容。
您必须至少返回$http(它返回一个承诺),并将结果作为承诺进行处理。
或者,您最好在getEmailAddress中创建一个promise实例,并直接在resendConfirmationMail中处理它
angular.module('angularApp', ['dialogs.main'])
.controller('TableController', function(dialogs, $http){
function getEmailAddress(){
var emailAddress ="empty";
return $http({
//The http method is defined here, which works as expected
}).then(function succes(response) {
emailAddress = response.data;
return emailAddress;
}, function resendError() {
return "Error!";
});
};
this.resendConfirmationMail = function(orderId){
//Inside this function, the function above is going to be used.
getEmailaAddress().then(function(emailAddress) {
// use the email address here.
});
};
});
有用的文档页面:$q()
$http实际上返回了一个承诺。另外,一个好的模式是,首先在服务中处理任何与数据相关的操作的返回承诺,然后将该承诺向上传递到可以处理UI操作的控制器。我已经包括了一个简化的plunkr,它显示了这些承诺是如何从服务传递到控制器的。只需单击控制器中的“获取数据”按钮,您将看到事件如何与系列a“alert()s”一起工作。注意,我使用$timeout代替$http。使用$http时,承诺处理将是相同的。详情如下:
html:启动一切。“获取数据”按钮调用getData()
方法在控制器中
mock_ajax_service.js:在这里,服务模拟一个mock ajax调用
使用由控制器按钮调用的$timeout$超时,
与$http非常相似,它返回一个真正的承诺。一旦兑现诺言
返回,它被处理(警报),承诺被传递到
链到控制器(返回该;)
您必须使用$q.defer()
@cl3m返回承诺,您是正确的OP必须返回承诺,但是在这里使用$q
将是错误的:$http
返回承诺,所以他们只需要返回该承诺。如果$http
@Duncan已经返回了一个非常好的承诺,请不要创建新的承诺,如果存在内部逻辑,则可能需要这些逻辑。也就是说,响应成功,响应中的任何数据都可能指向无效条件。在这种情况下,我需要拒绝它。不,如果数据无效并且您想要拒绝,您只需抛出一个错误。实际上,不需要由$q
创建单独的承诺,来自$http
的承诺就足以满足您在此处所需的一切。如果您想要拒绝承诺,请返回$q.reject()
。
<!DOCTYPE html>
<html ng-app="plunker">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<script data-require="angular.js@1.4.x" src="https://code.angularjs.org/1.4.9/angular.js" data-semver="1.4.9"></script>
<script src="app.js"></script>
<script src="mock_ajax_service.js"></script>
</head>
<body ng-controller="MainCtrl">
<p>Click on button to request data and handle the promise chain</p>
<div>
<button ng-click="getData()">Get Data!</button>
</div>
</body>
</html>
var app = angular.module('plunker', ['mockjaxservice_module']);
app.controller('MainCtrl', ['$scope', 'mockajaxservice',
function($scope, mockajaxservice) {
$scope.name = 'World';
var requestDataSuccess = function (results) {
console.log('handle success data in controller/UI');
alert('handle success data in controller/UI');
return;
}
var requestDataFail = function (results) {
console.log('handle failed data in controller/UI');
return;
}
$scope.getData = function () {
var UIPromise = mockajaxservice.requestData();
UIPromise.then(requestDataSuccess,requestDataFail);
}
}]);
'use strict';
var mockAjaxModule = angular.module('mockjaxservice_module', []);
mockAjaxModule.factory('mockajaxservice', ['$timeout', function ($timeout) {
this.service_count = 0;
this.service_count_object = {
count:0
}
var that = this;
var requestDataSuccess = function (results) {
console.log('handle success data in service');
alert('handle success data in service then pass it up to controller');
that.service_count = 10;
that.service_count_object.count = 10;
that.utcTime = Math.floor((new Date()).getTime() / 1000);
return that;
}
var requestDataFail = function (results) {
console.log('handle failed data in service')
return that;
}
this.requestData = function () {
var requestDataPromise = $timeout(function() {
}, 500);
requestDataPromise.then(requestDataSuccess,requestDataFail);
return requestDataPromise;
}
return this;
}]);