2016-11-30 5 views
0

Я уже начал приключение с AngularJs, но идея обещаний и возвращающихся асинхронных данных переполнила меня.ngResource return return callback result by service

Я пытаюсь выполнить простой сбор данных с помощью метода .factory и $ resource service.

Вот мой $ служба ресурс возвращения обещание

(function() { 
     angular.module('token') 
      .factory('tokenService', ['$resource', 'baseUri', tokenService]); 

     function tokenService($resource, baseUri) { 
      return $resource(baseUri + 'token', {}, { 
       post: { 
        method: 'POST', 
        headers: { 
         'Content-Type': 'application/x-www-form-urlencoded' 
        } 
       } 
      }); 
     } 
    })(); 

Я использую эту услугу в другой сервис, который должен возвращает данные.

(function() { 
angular.module('authorization') 
    .factory('authorizationService', ['$httpParamSerializer', 'tokenService', authorizationService]); 

function authorizationService($httpParamSerializer, tokenService) { 
    return { 
     authorization: function(user){ 
      var token = {}; 
      tokenService.post({}, $httpParamSerializer({ 
       grant_type: 'password', 
       username: user.login, 
       password: user.password, 
       client_id: user.clientId 
      }), function(response){ 
       token = response; 
       console.log('authorizationResponse', response); 
       console.log('authorizationToken', token); 
      }); 
      //  .$promise.then(function(response){ 
      //  token = response; 
      //  console.log('authorizationResponse', response); 
      //  console.log('authorizationToken', token); 
      // }); 
      console.log('finalToken', token); 
      return token; 
     } 
    }; 
} 
})(); 

Но я не могу заставить переменную токена получить результат tokenService.post() перед сохранением.

+0

Короткий ответ, вы не можете. Ваш авторизационный сервис должен будет вернуть Promise. Существует проект предложения по добавлению новой функции [ожидание] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await) на язык, но это путь , – teppic

ответ

0

Сначала введите $q в ваш authorizationService.

Попробуйте это:

authorization: function(user) { 
    return $q(function(resolve, reject) { 
    tokenService.post({}, { 
     grant_type: 'password', 
     username: user.login, 
     password: user.password, 
     client_id: user.clientId 
    }) 
    .$promise 
    .then(function(token) { 
     resolve(token); 
    }) 
    .catch(function(err) { 
     reject(err); 
    }); 
    }); 
} 

Затем в контроллере, вы можете использовать:

authorizationService.authorization(user) 
.then(function(token) { 
    // Some code here 
}) 
.catch(function(err) { 
    // Handle error here 
}); 

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

  • Нет связанных вопросов^_^