我正在使用defer
将诺言(getAuthToken
)转换为可观察的。然后使用subscribe
将token
变量分配给响应。
*可观察到的东西是新手,但是只要我一个人就能尝试
我曾经尝试使用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'
}
}
答案 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)
您误解了“可观察对象同步执行”的含义...而且我不怪您,因为这是描述可观察对象的一种极其令人困惑/欺骗的方式。
事实是,如果可观察调用的所有基础确实是同步的,则可观察对象将同步执行,而承诺将异步执行,无论其基础是什么。在这种情况下,由于您的可观察对象具有异步事物,因此它将异步执行。
最佳实践是始终将可观察对象视为正在执行异步操作,而不管它们是否愿意。