Как правильно связать воедино Обещания для синхронного выполнения кода - PullRequest
0 голосов
/ 23 июня 2019

Я опубликовал похожий вопрос несколько дней назад, но внес некоторые изменения, и комментировать этот вопрос стало утомительно, поэтому было рекомендовано задать новый вопрос.Идея состоит в том, что я хочу выполнить четыре уравнения синхронно.Внутри этих уравнений есть HTTP-запросы.У меня два уравнения работают правильно, но есть одно уравнение, которое включает два запроса POST и запросы GET.Второй запрос опирается на первый, а третий запрос опирается на второй.

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

Фрагмент синхронного кода:

this.getData1(user, userID).then(() =>
{
    this.getData2(user, userID)
        .then(() =>
        {
            this.getData3(user, lan).then(() =>
            {
                this.userCheck(user);
            })

        });
});

У меня работают getData2 и getData3.

getData1 выглядит так:

getData1(user: string, id: string){
    console.log('grabbing CC information', id, user);
    return new Promise((resolve, reject) =>
        {
    var status: string;
    this._apiService.getAssertion(id).subscribe((data: any) =>
    {
        let assert = data.toString();
        this._apiService.getToken(assert).subscribe((data: any) =>
        {
            let tkn = data.access_token.toString();

            this._apiService.ccMeta(tkn, guid).subscribe((data: any) =>
            {
                parseString(data, (err, result) =>
                {
                    if (err)
                    {
                        throw new Error(err);
                    }
                    else
                    {
                        status = result['entry']['content'][0]['m:properties'][0]['d:status'][0];
                        this.ccData.push(
                        {
                            key: 'userStatus',
                            value: status
                        })
                    }
                });
            });
        });
    });
    resolve()
        });
}

Я также пытался что-то вродеэто ранее.Это также не сработало.

apiService.getAssertion(id).then(assert =>
{
    return apiService.getToken(assert.toString(), user);
}).then(data =>
{
    return apiService.ccMeta(data.access_token.toString(), id);
}).then(parseStringPromise).then(information =>
{
    this.ccData.push(
    {
        key: 'userStatus',
        value: information.entry
    });
});

Внутри этой функции функция getAssertion представляет собой запрос POST.Функция getToken - это еще один POST-запрос, основанный на подтверждении из первого POST-запроса.Наконец, ccMeta - это запрос get, который опирается на токен из второго запроса POST.

Я ожидаю, что сначала будет выполняться getData1, затем getData2, затем getData3 и, наконец, userCheck.Внутри getData1 мне нужно утверждение, затем токен, а затем получить запрос для синхронного выполнения.Приведенный выше фрагмент кода выполняется неправильно.Утверждение не используется должным образом в уравнении getToken.

Буду очень признателен за помощь.

1 Ответ

2 голосов
/ 23 июня 2019

Поскольку эти HTTP-вызовы на самом деле являются наблюдаемыми, а не обещаниями, я думаю, вам следует изучить наблюдаемую композицию, используя, например, pipe и switchMap. Если вы все еще хотите, чтобы метод возвращал обещание, он может выглядеть следующим образом:

getData1(user: string, id: string) {
  console.log('grabbing CC information', id, user);

  return new Promise((resolve, reject) => {
    this._apiService.getAssertion(id)
      .pipe(
        switchMap((data: any) => {
          let assert = data.toString();
          return this._apiService.getToken(assert);
        }),
        switchMap((data: any) => {
          let tkn = data.access_token.toString();
          return this._apiService.ccMeta(tkn, guid);
        }),
      )
      .subscribe(
        data => {
          parseString(data, (err, result) => {
            if (err) {
              reject(new Error(err));
              return;
            }

            const status: string = result['entry']['content'][0]['m:properties'][0]['d:status'][0];
            this.ccData.push({
              key: 'userStatus',
              value: status
            });
            resolve();
          });
        },
      );
    });
}
...