Angularjs 如何通过承诺从服务中的函数回调向控制器返回值
我正在准备一个简单的电子邮件发送者功能(是的,我知道我不应该把它放在我的前端,这只是一个测试)。该功能可以正常工作,但我需要将状态消息返回给我的控制器,以便在发送/拒绝电子邮件后在页面上显示该消息 我已经试着让它工作了几个小时,但是我缺乏处理回电/承诺的适当知识,所以我需要一些指导。如何修改下面的代码,以便控制器可以访问状态消息Angularjs 如何通过承诺从服务中的函数回调向控制器返回值,angularjs,asynchronous,angularjs-service,Angularjs,Asynchronous,Angularjs Service,我正在准备一个简单的电子邮件发送者功能(是的,我知道我不应该把它放在我的前端,这只是一个测试)。该功能可以正常工作,但我需要将状态消息返回给我的控制器,以便在发送/拒绝电子邮件后在页面上显示该消息 我已经试着让它工作了几个小时,但是我缺乏处理回电/承诺的适当知识,所以我需要一些指导。如何修改下面的代码,以便控制器可以访问状态消息 core.service('email', ['$q', 'fetchContent', function($q, fetchContent) { return
core.service('email', ['$q', 'fetchContent', function($q, fetchContent) {
return {
sendEmail: function(info) {
// Fetch token and recipient info from JSON file
var getEmailInfo = fetchContent.getEmailInfo();
getEmailInfo.then(function(res) {
// Access the token and recipient from the JSON file we just requested
var token = res.data.email.key,
recipient = res.data.email.recipient;
// Create a new mandrill instance and set the params
var emailProvider = new mandrill.Mandrill(token),
params = {
"message": {
"from_email": info.sender,
"to":[
{ "email": recipient }
],
"subject": info.company,
"text": info.message
}
};
// Return a deferred promise containing our status message
var deferred = $q.defer();
emailProvider.messages.send(params, function(res) {
deferred.resolve('Success message');
}, function(err) {
deferred.reject('Error message');
})
return deferred.promise;
});
}
}
}]);
然后,我想从我的控制器接收状态消息,成功或错误,来自我服务中的sendmail
功能:
$scope.send = function(data) {
var validate = validation.validateEmail(data);
validate.then(function(res) {
if (res !== true) {
$scope.error = res;
}
else {
var status = email.sendEmail(data);
console.log(status); // Always becomes undefined now
}
});
}
在您的服务中,使用deferred.resolve()调用控制器中.then()方法中的success函数 服务
core.service('email', ['$q', 'fetchContent', function($q, fetchContent) {
return {
sendEmail: function(info) {
// Fetch token and recipient info from JSON file
var getEmailInfo = fetchContent.getEmailInfo();
getEmailInfo.then(function(res) {
// Access the token and recipient from the JSON file we just requested
var token = res.data.email.key,
recipient = res.data.email.recipient;
// Create a new mandrill instance and set the params
var emailProvider = new mandrill.Mandrill(token),
params = {
"message": {
"from_email": info.sender,
"to":[
{ "email": recipient }
],
"subject": info.company,
"text": info.message
}
};
// Return a deferred promise containing our status message
var deferred = $q.defer();
emailProvider.messages.send(params, function(res) {
deferred.resolve('Success message');
}, function(err) {
deferred.reject('Error message');
})
return deferred.promise;
});
}
}
}]);
控制器
$scope.send = function(data) {
var validate = validation.validateEmail(data);
validate.then(function(res) {
if (res !== true) {
$scope.error = res;
}
else {
email.sendEmail(data).then(function(result){
console.log(result); // success message
}, function(reason){
console.log(result); // error message
});
}
});
}
已经试过了,它仍然说email.sendmail(数据)未定义,因此我无法调用它的then():(可能是承诺不能从另一个then()函数中返回吗?因为它现在在getEmailInfo中。然后(…)最终解决了它。只是缺少getEmailInfo前面的return语句。然后(…)所以它实际上从sendmail函数返回了一些东西。