2015-01-31 2 views
0

На моем экране входа в систему он вызывает функцию входа в систему, когда я нажимаю кнопку «Вход в систему». На самом деле это ng-submit = "login()". Код находится в моем контроллере LoginCtrl.конвертировать в обещание решить асинхронный характер http

function onSuccessfulLogin() { 
    $scope.failureMessage = ""; 
    $rootScope.mainbody.position = 'absolute'; 

    if (nextState !== null && typeof nextState.name === 'string' && nextState.name !== '') { 
     console.log("calling nextState ......"); 
     $state.go(nextState.name, nextState.params); 
    } else { 
     $state.go('main', {}); 
    } 
} 

$scope.login = function() { 
    disableLoginButton(); 

    $rootScope.login = { 
     goodmsg : true, 
     errormsg : false 
    } 

    $scope.failureMessage = "Signing in Analytics Dashboard ...."; 
    User.authenticate($scope.username, $scope.password, onSuccessfulLogin, onFailedLogin, $scope.persist); 
}; 

У меня есть сервис под названием User и я вызываю функцию «аутентификации», когда я нажмите кнопку входа в выше. В настоящее время он работает нормально, пока я не добавил больше HTTP-вызовов внутри функции this.authenticate. То, что я хотел бы сделать, это конвертировать это, чтобы обещать, чтобы он вызывал onSuccessfulLogin() в нужное время, когда были получены все данные из всех HTTP-запросов. Тем не менее, я не уверен, как я буду конвертировать «this.authenticate», чтобы вернуть обещание. Btw, TokenService - это фабрика Restangular, которую я создал.

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

this.authenticate = function(username, password, successCallback, errorCallback, persistData) { 

    this.removeAuthentication(); 

    TokenService.setResponseInterceptor(function (data, operation, what, url, response) { 
     if (operation == 'post') { 
      $rootScope.locationResourceId = response.headers('Location').split('/')[response.headers('Location').split('/').length-1] 
     } 
     return response.data; 
    }); 

    TokenService.one('authentokens').customPOST({'email' : username , 'password' : password}, '', {app : 'baam'}) 
     .then(function(data) { 
      var userresourceId = data.href.split('/')[data.href.split('/').length-1] 

      $rootScope.userData = { 
       isAuthenticated : true, 
       username : username, 
       bearerToken : data.token, 
       expirationDate : new Date(data['expires']), 
       resourceId : userresourceId, 
       tokenResourceId : $rootScope.locationResourceId 
      }; 

      TokenService.one('users').customGET($rootScope.userData.resourceId, { 'token' : $rootScope.userData.bearerToken }) 
       .then(function(jsondata) { 
        $rootScope.userData.locale = retrieveLocale(); 

        // Set locale via Factory 
        var currentLocale = CurrentLocaleFactory; 
        currentLocale.locale = $rootScope.userData.locale; 

        $rootScope.userData.firstname = (jsondata.firstname == null) || (jsondata.firstname == null) ? '' : jsondata.firstname; 
        $rootScope.userData.lastname = (jsondata.lastname == null) || (jsondata.lastname == null) ? '' : jsondata.lastname; 
        var avatar = username.split('@')[0].toLowerCase(); 

        $http.get('assets/json/avatar.json') 
        .then(function(res) { 

         $rootScope.userData.gravatarLink = res.data.gravatarLink; 
         if (persistData === true) { 
          saveData(); 
         } 
         if (typeof successCallback === 'function') { 
          successCallback(); 
         } 
        }, function() { 
         $rootScope.userData.gravatarLink = "assets/img/noface.png"; 
         if (persistData === true) { 
          saveData(); 
         } 
         if (typeof successCallback === 'function') { 
          successCallback(); 
         } 
        }) 
      }) 
     }, function(data) { 
      if (typeof errorCallback === 'function') { 
       if (data.error_description) { 
        errorCallback(data.error_description); 
       } else { 
        errorCallback(data.data.message); 
       } 
      } 
     }) 
}; 

ответ

1

Возвращение обещания от функции:

//First return 
return TokenService.one('authentokens').customPOST({ 
    'email': username, 
    'password': password 
}, '', { 
    app: 'baam' 
}).then(function(data) { 
    /* ... */ 
    // Second return inside the success handler 
    return TokenService.one('users').customGET($rootScope.userData 
     .resourceId, { 
      'token': $rootScope.userData.bearerToken 
     }).then(function(jsondata) { 
     /* ... */ 
    }) 
}) 

Ваша функция будет возвращать обещание, что будет решена после того, как асинхронные вызовы вернулись.

Если заказ не важен, вы также можете использовать $q.all(arrayOfPromises), который возвращает обещание, которое будет разрешено, когда все обещания в массиве вернулись.

+0

Хорошо, я попробую сейчас. – devwannabe

+0

Думаю, я понимаю, как это работает сейчас. Я также добавил возвращение внутрь успеха и не слишком отставал от основного возврата для каждого. благодаря – devwannabe

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