вложенные асинхронные вызовы JavaScript

В моем сценарии есть функция, которая регистрирует пользователя следующим образом:

class myClient {
    SignIn() {
            this._userManager.signinRedirect();      

            this._userManager.processSigninResponse().then(function (response) {               

                manager._userManager.getUser().then(function (user) {
                    manager._loggedUser = user;
                });        
            })
        }
}

Как видите, есть два вложенных промиса. Пользователь входит в систему только после разрешения самого внутреннего промиса (т.е.: manager._loggedUser = user)

Теперь я хотел бы, чтобы мой класс предоставлял только два метода: SignIn() [как описано выше] и GetUserInfo():

GetUserInfo() {
     // ...
    return this._loggedUser;
}; 

Так что любой, кто использует мой класс, просто должен выполнить следующие шаги, чтобы получить профиль пользователя, вошедшего в систему:

  1. создать объект
  2. вызвать метод входа
  3. получить информацию о пользователе

Как я могу «синхронизировать» 2-й и 3-й шаги, чтобы гарантировать, что _loggedUser не является нулевым после первого вызова метода signin() и GetUserInfo() после?


person alessalessio    schedule 15.05.2017    source источник


Ответы (1)


Его следует сгладить, чтобы избежать «ада обратных вызовов» (одна из причин, по которой используются промисы) — если только нет причин этого не делать (например, когда response используется во вложенных промисах). И он должен вернуть обещание.

SignIn() {
  this._userManager.signinRedirect();      

  return this._userManager.processSigninResponse().then(function (response) {               
    return manager._userManager.getUser();
  })
  .then(function (user) {
    manager._loggedUser = user;
  });        
}

Учитывая, что GetUserInfo зависит от результатов SignIn, при их совместном использовании следует использовать промисы.

obj.SignIn().then(() => {
  const info = obj.GetUserInfo();
  ...
});
person Estus Flask    schedule 15.05.2017