2015-07-09 6 views
1

Это мой кодКак назвать отложенное обещание?

$scope.login = function(){ 
     $http.post(URL+'auth/login', {email:'[email protected]', password:'password'}).then(function(r){ 
      locker.put('token', r.data.token); 

      console.log(locker.get('token')); 
     }); 
    }; 


    $scope.one = function(){ 
     IngredientService.ingredients().then(function (response) { 
      var data = response.data; 
      locker.put('token', response.headers('Authorization').split(" ")[1]); 

      console.log(locker.get('token')); 
     }); 
    }; 

    var deferred = $q.defer(); 
    var promise = deferred.promise; 

    promise = promise.then($scope.login()).then($scope.one()); 

Я хочу войти(), когда имеет конец, я хочу, чтобы выполнить одну().

но почему мой one() начал работать до входа в систему()?

это сделал ошибку, потому что один() нужен маркер от входа()

ответ

0

Я хотел бы предложить, чтобы иметь два разных контроллера here..i.e. один для входа в систему позволяет сказать LoginController и другие, чтобы выполнить один() позволяет сказать HomeController

var app=angular.module('myApp',[]); 
app.controller('loginController',function($scope){ 
     $scope.login = function(){ 
     $http.post(URL+'auth/login', {email:'[email protected]', password:'password'}).then(function(r){ 
      locker.put('token', r.data.token); 

      console.log(locker.get('token')); 
     }); 
    }; 
}); 

app.controller('homeController',function($scope){ 
     $scope.one = function(){ 
     IngredientService.ingredients().then(function (response) { 
      var data = response.data; 
      locker.put('token', response.headers('Authorization').split(" ")[1]); 

      console.log(locker.get('token')); 
     }); 
    }; 
}); 

так, как только Войти делается маркер будет сохранен, а затем один() можно назвать Боте функции являются в другом контроллере, предполагая, что у вас есть выделенный просмотр для входа.

Надеется, что вы вызываете метод $ scope.login() где-то

ИЛИ

попробовать ниже:

$scope.login = function(){ 
     $http.post(URL+'auth/login', {email:'[email protected]', password:'password'}).then(function(r){ 
      locker.put('token', r.data.token); 

      console.log(locker.get('token')); 
      $scope.one(); 
     }); 
    }; 


    $scope.one = function(){ 
     IngredientService.ingredients().then(function (response) { 
      var data = response.data; 
      locker.put('token', response.headers('Authorization').split(" ")[1]); 

      console.log(locker.get('token')); 
     }); 
    }; 
+0

В идеале вы должны иметь два различных контроллеров для двух представлений ..здесь в урском случае у вас есть просмотр в режиме входа в систему и некоторые другие взгляды..с наличием 2 контроллеров имеют смысл ... plz повысит его, если это поможет u – Rahul

+0

на домашнем контроле ller Как я могу вызвать $ scope.one(), затем ($ scope.one). then ($ scope.one); ? точка моего вопроса заключается в том, как я могу вызвать асинхронный 1-й, затем 2-й, а затем 3-й –

+0

. Я думал, что у вас есть вид входа в систему, а затем после входа в систему вы устанавливаете токен, вы перенаправляете на другой вид с помощью HomeController, используя ngRoute или UiRoute, где у вас есть один() метод define, и вы сможете вызвать метод one() из этого представления, поскольку вы уже вошли в систему и установлен токен. Зачем вам нужно использовать обещание в этом случае. Пожалуйста, поправьте меня, я Worng. – Rahul

0

Я думаю, что ваш логин и никогда нельзя назвать, потому что «обещание» никогда не будет разрешено.

Вы должны сделать, как показано ниже, пожалуйста, обратите внимание, что $ scope.login должен вернуть обещание, а затем он может быть привязан к «затем».

$scope.login = function(){ 
     return $http.post(URL+'auth/login', {email:'[email protected]', password:'password'}).then(function(r){ 
      locker.put('token', r.data.token); 

      console.log(locker.get('token')); 
     }); 
    }; 


    $scope.one = function(){ 
     IngredientService.ingredients().then(function (response) { 
      var data = response.data; 
      locker.put('token', response.headers('Authorization').split(" ")[1]); 

      console.log(locker.get('token')); 
     }); 
    }; 

    $scope.login().then($scope.one); 
+0

привет, как насчет того, если я хочу вызвать и добавить функцию antoher, скажем, $ scope.login(). Then ($ scope.one). Then ($ scope.one); Можете ли вы дать мне пример? Это ошибка, потому что 3-я функция была вызвана до выполнения второй функции? –

+0

Точка - это функция, тогда она должна вернуть обещание, если оно асинхронно, а затем следующее может выполнить функцию после того, как предыдущее обещание будет разрешено. причина, по которой третий вызвал до второго, - это то, что вы пропускаете «возврат» в $ scope.one. – Ron

0

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

Попробуйте изменить функцию входа в систему, чтобы вместо этого вернуть вызов службы.

$scope.login = function(){ 
    $http.post(URL+'auth/login', {email:'[email protected]', password:'password'}).then(function(r){ 
     locker.put('token', r.data.token); 

     console.log(locker.get('token')); 
     return IngredientService.ingredients(); 
    }); 
}; 

Затем сделайте ваш звонок, чтобы начать цепочку, как это:

$scope.login().then(function(response) { 
    var data = response.data; 
    locker.put('token', response.headers('Authorization').split(" ")[1]); 

    console.log(locker.get('token')); 
}) 

Проверьте эту статью на обещания и цепочки:

https://www.airpair.com/angularjs/posts/angularjs-promises

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