ионное обещание и хранение - PullRequest
0 голосов
/ 13 октября 2019

как вернуть вызов API после установки хранилища или обнаружения ошибки? Из console.log, seq всегда возвращалось до сохраненного токена .

Моя желаемая последовательность:

  1. Пользователь отправляетформы с использованием функции SubmitForm () .
  2. Функция вызывает другую функцию на странице user.ts и, если аутентификация пользователя прошла успешно, откроется страница login.ts.
  3. user.ts в настоящее время обрабатывает вызов API и устанавливает хранилище (в случае успешной аутентификации). Хранение всегда задерживалось после того, как была вызвана проверка isLoggedIn (на странице login.ts), поэтому не может всплыть.

login.ts

SubmitForm(account: any) {
    this.user.login(account).subscribe((resp) => {
        if(this.user.isLoggedIn){
          this.navCtrl.pop();
        }
    }, (err) => {

    });
}

user.ts (пользовательский провайдер)

login(logininfo: any) {
    let seq = this.api.post('auth/login', logininfo).share();

    seq.subscribe((res: any) => {
      if (res.status == 'success') {
        this.storage.set('token', res.token).then(data => {
          console.log('Token Stored', data); //This always get called after `return seq;`
          this.token = data;
          this.isLoggedIn = true;
        },
        error => {
          console.log('Error storing token', error);
        });
      }
    }, err => {
      console.error('ERROR', err);
    });

    return seq; //This always called before the token was stored
}

1 Ответ

0 голосов
/ 13 октября 2019

Когда у вас есть функция, подобная вашей, и вам нужно «дождаться завершения асинхронных функций внутри нее», вам нужно использовать async / await. По сути, это оборачивает всю вашу функцию в одно обещание, которое затем возвращается. Асинхронная функция всегда автоматически возвращает Promise.

Нечто подобное может сработать, однако я не совсем уверен в вашем коде, поскольку вы предоставили только фрагмент кода. Если вы предоставите кодовую коробку, я могу взглянуть на нее глубже.

  async login(logininfo: any) {
    let seq = this.api.post('auth/login', logininfo);

    let returnValue = undefined;
    let subscription = await seq.subscribe(async (res: any) => {
      if (res.status == 'success') {
        returnValue = await this.storage.set('token', res.token).then(data => {
          console.log('Token Stored', data); //This always get called after `return seq;`
        },
        error => {
          console.log('Error storing token', error);
        });
      }
    }, err => {
      console.error('ERROR', err);
    });

    return returnValue; //This always returns a promise
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...