2016-12-12 3 views
2

저는 Angularjs에 익숙하지 않습니다.이 튜토리얼을 따라야합니다 : http://mherman.org/blog/2015/07/02/handling-user-authentication-with-the-mean-stack/#.WE70iubhCM8. 그러나 나는 $ q.defer()를 사용할 때 이해하지 않는다. 예를 들어, folllowing AngularJS와 코드를 사용하는 이유 $의 q.defer() :

function login(username, password) { 

     // create a new instance of deferred 
     var deferred = $q.defer(); 

     // send a post request to the server 
     $http.post('/user/login', 
     {username: username, password: password}) 
     // handle success 
     .success(function (data, status) { 
      if(status === 200 && data.status){ 
      user = true; 
      deferred.resolve(); 
      } else { 
      user = false; 
      deferred.reject(); 
      } 
     }) 
     // handle error 
     .error(function (data) { 
      user = false; 
      deferred.reject(); 
     }); 

서버 측 코드는 다음과 같습니다

router.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { 
     return next(err); 
    } 
    if (!user) { 
     return res.status(401).json({ 
     err: info 
     }); 
    } 
    req.logIn(user, function(err) { 
     if (err) { 
     return res.status(500).json({ 
      err: 'Could not log in user' 
     }); 
     } 
     res.status(200).json({ 
     status: 'Login successful!' 
     }); 
    }); 
    })(req, res, next); 
}); 

왜 다음 AngularJS와 코드에서 사용하지 :

function getUserStatus() { 
     return $http.get('/user/status') 
     // handle success 
     .success(function (data) { 
     if(data.status){ 
      user = true; 
     } else { 
      user = false; 
     } 
     }) 
     // handle error 
     .error(function (data) { 
     user = false; 
     }); 
    } 

서버 측 코드는 다음과 같습니다

router.get('/status', function(req, res) { 
    if (!req.isAuthenticated()) { 
    return res.status(200).json({ 
     status: false 
    }); 
    } 
    res.status(200).json({ 
    status: true 
    }); 
}); 
+1

거의 [** 절대 사용하지 마십시오 **] (http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it) ! 이 예제에서 배우지 말고 널리 알려진 반 패턴을 사용합니다. – Bergi

답변

7

$ q.defer()를 사용하여 Promise를 만들면됩니다. Promise는 함수로 하나의 값이나 오류를 나중에 반환합니다.. 따라서 값이나 오류를 반환해야하는 비동기 프로세스가있을 때마다 $ q.defer()를 사용하여 새 Promise를 만들 수 있습니다.

그러나 대부분의 경우 Angular는 이미이 작업을 수행했으며 반환 된 약속은 $ http 서비스와 같이 사용할 수 있습니다. 당신의 예는 당신이 당신 자신의 것을 창조하고자 할 때의 좋은 예를 보여준다.

일반적으로 $ http 서비스는 서버에서 값을 반환하거나 http 호출이 실패하면 오류를 표시합니다. 귀하의 예제에서 그러나 http 호출 자체가 성공했을 때 Promise (= 거부) 오류를 반환하고 싶지만 success 속성에 대해 올바르지 않은 값을가집니다.

이 작업을 수행하려면 반환 값 (또는 오류)을 수동으로 제어 할 수있는 새 약속을 만듭니다. 이 예제에서는 http 호출이 성공하고 data.success == true 인 경우에만 resolve() (= 값을 반환) 함수를 호출하여 함수를 호출합니다. 다른 모든 경우 (http 호출이 실패하거나 올바른 data.status 값이없는 경우) 새로 작성된 Promise는 거부됩니다 (= 리턴 오류).

1

$q.defer()을 사용하면 login 함수를 호출 할 수있는 약속 객체를 만들 수 있습니다.

은 이연 객체를 생성 기능 만 그것에 resolve() 또는 reject()를 호출 할 수 있도록 오히려 전체 deferred 객체보다 deferred.promise를 반환해야합니다,하지만 약속이 성취 될 때까지 login의 호출 함수는 여전히 기다릴 수 있습니다. 이해가 되니?

+0

잘 설명되어 있습니다. 이것은 정확하게 그것이하는 것입니다. –

관련 문제