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函数返回了一些东西。