Наблюдаемый не действует синхронно - PullRequest
0 голосов
/ 09 июля 2019

Я использую defer для преобразования обещания (getAuthToken) в наблюдаемое. Затем, используя subscribe, присвойте ответу переменную token.

* новичок в наблюдаемых, но пытался столько, сколько мог в одиночку

Я пытался использовать from для преобразования обещания, хотя на самом деле это не решение проблемы, но попытался его использовать. Также используется труба (карта ()) ...

Я имею в виду эту статью , которая объясняет, что наблюдаемые должны быть синхронными. Хотя мой пример, похоже, не действует таким образом.

getFakeConfig() {
  const token = defer(getAuthToken).subscribe(res => {
    console.log('res =', res)
    return res
  })

  console.log('token =', token)

  return {
    headers: {
      'content-type': 'application/json',
      Authorization: `${token}`,
    },
  }
}

makeRequest() {
  const config = this.getFakeConfig()
  console.log('config =', config)
}

// in a different file, basically what it does
export const getAuthToken = () => {
  return axios(options)
    .then(response => response.data.token)
}

Удар makeRequest() выходы:

token = Subscriber {
  ...
}

config = {
  headers: {
    'content-type': 'application/json',
    Authorization: '[object Object]'
  }
}

res = token234234234

Я ожидаю, что это выведет:

res = token234234234

token = token234234234

config = {
  headers: {
    'content-type': 'application/json',
    Authorization: 'token234234234'
  }
}

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Отсрочка не вариант, отсрочка документов .

Лучшее, что вы можете сделать, чтобы ваш код вел себя синхронно - это использовать async/await (идеально подходит для обещаний ),

async getFakeConfig() {
  const token = await getAuthToken();
  console.log('token =', token);

  return {
    headers: {
      'content-type': 'application/json',
      Authorization: `${token}`,
    },
  }
}

Но если вы все еще хотите использовать Observables, вам нужно привыкнуть к его асинхронному поведению,

import { from } from 'rxjs';
getFakeConfig() {
    return from(getAuthToken).pipe(map(token => {
        console.log('token =', token);
        return {
          headers: {
            'content-type': 'application/json',
            Authorization: `${token}`,
          },
        }
    }));
}

, а поскольку getFakeConfig возвращает Observable,

makeRequest() {
  this.getFakeConfig().subscribe(config => {
      console.log('config =', config)
  });
}
0 голосов
/ 09 июля 2019

вы неправильно понимаете, что имеется в виду под "синхронным выполнением наблюдаемых" ... и я не виню вас, потому что это чрезвычайно запутанный / вводящий в заблуждение способ описания наблюдаемого.

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

Лучше всего всегда обращаться с наблюдаемыми объектами так, как если бы они выполняли асинхронные операции независимо от того, будут они выполнять или нет.

...