观察不到同步动作

时间:2019-07-09 20:42:49

标签: typescript promise rxjs axios rxjs6

我正在使用defer将诺言(getAuthToken)转换为可观察的。然后使用subscribetoken变量分配给响应。

*可观察到的东西是新手,但是只要我一个人就能尝试

我曾经尝试使用from来转换诺言,虽然这并不是解决问题的方法,但确实尝试过使用它。还使用了pipe(map())...

我指的是article,它解释了可观察对象应该是同步的。尽管我的示例似乎没有采取这种行动。

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 个答案:

答案 0 :(得分:1)

defer docs不是“延迟”选项。

为了使代码能够同步运行,您能做的最好的事情就是使用async/await(非常适合 promises ),

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)
  });
}

答案 1 :(得分:0)

您误解了“可观察对象同步执行”的含义...而且我不怪您,因为这是描述可观察对象的一种极其令人困惑/欺骗的方式。

事实是,如果可观察调用的所有基础确实是同步的,则可观察对象将同步执行,而承诺将异步执行,无论其基础是什么。在这种情况下,由于您的可观察对象具有异步事物,因此它将异步执行。

最佳实践是始终将可观察对象视为正在执行异步操作,而不管它们是否愿意。