2015-06-20 2 views
1

Я собираю простую функцию отправителя электронной почты (да, я знаю, что я не должен ставить ее в свой интерфейс, это просто контрольная работа). Функциональность работает, но мне нужно вернуть сообщение статуса моему контроллеру, чтобы я мог отображать его на моей странице, как только сообщение было отправлено/отклонено.Как вернуть значение контроллеру из функции обратного вызова в службе по обещанию

Я пытаюсь заставить его работать в течение нескольких часов, но отсутствие у меня надлежащих знаний, работающих с обратными вызовами/обещаниями, не дает мне возможности, поэтому мне нужно руководствоваться. Как мне изменить код ниже, чтобы контроллер мог получить доступ к сообщению о статусе?

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; 
     }); 
    } 
    } 
}]); 

А потом из моего контроллера я хочу получать сообщения о состоянии, успех или ошибку, из функции sendEmail в моей службе:

$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 
    } 
    }); 
} 

ответ

1

В вашей службе использовать deferred.resolve() для вызова функции успеха в методе .then() в вашем контроллере.

Сервис

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 
     }); 
    } 
    }); 
} 
+0

Уже попробовал это, и она по-прежнему говорит, что email.sendEmail (данные) не определено, так что поэтому я не могу назвать то() на нем :( – Chrillewoodz

+0

Может быть, что обещание не может быть возвращено изнутри другой функции()? Теперь он находится внутри getEmailInfo.then (....) – Chrillewoodz

+0

Решил его наконец .. было просто неправильно пойте оператор return перед getEmailInfo.then (...), чтобы он фактически что-то возвращал из функции sendEmail. – Chrillewoodz

Смежные вопросы