RxJS-迭代从ajax返回的数据

RxJS-迭代从ajax返回的数据,ajax,rxjs,Ajax,Rxjs,我使用RxJS Ajax()返回一批GitHub用户。我想对每个用户进行迭代,只需从每个用户那里获取登录名。我能够迭代一个本地对象数组,但如果该对象数组来自Ajax,就不能迭代,不管我是否强制它成为一个带有RxJSfrom()的流 我通过RxJSfrom()将Ajax调用的结果放在一起,因此两个数组被视为相同的,但是如果我跳过from()并直接执行,则会出现相同的未定义的结果 const arrayFromAjax = ajax.getJSON(githubUsers); 而不是 const

我使用RxJS Ajax()返回一批GitHub用户。我想对每个用户进行迭代,只需从每个用户那里获取
登录名
。我能够迭代一个本地对象数组,但如果该对象数组来自Ajax,就不能迭代,不管我是否强制它成为一个带有RxJS
from()
的流

我通过RxJS
from()
将Ajax调用的结果放在一起,因此两个数组被视为相同的,但是如果我跳过
from()
并直接执行,则会出现相同的
未定义的结果

const arrayFromAjax = ajax.getJSON(githubUsers);
而不是

const arrayFromAjax = from(ajax.getJSON(githubUsers));
Ajax()中的对象数组与类似的本地定义的对象数组有何不同?如何迭代Ajax结果?

from()
操作符创建一个可观察对象,一次一个地发出提供的值,因此您不是在接收数组,而是在接收单个对象

ajax.getJSON(githubUsers)
返回一个对象数组。这就是为什么你会看到这两种情况之间的差异

您可以使用本地数组将测试用例更改为以下内容,以匹配相同的形状:

let localArrayOfObj = from([
  [
    { login: 'Barbara Holland', loggedIn: false, token: null },
    { login: 'Joyce Byers', loggedIn: true, token: 'abc' },
    { login: 'Nancy Wheeler', loggedIn: true, token: '123' }
  ]
]);
在这里的代码中:
data
是一个数组,因此,如果要单独修改元素,可以执行以下操作:

arrayFromAjax.pipe(
  map((dataArray) => dataArray.map(data => data.login))
).subscribe(console.log);   // This is undefined

更好的方法是使用
of()
ha,是的,这更好:-)更新-以这种方式使用Ajax的解决方案是RxJS
switchMap()
。我发现的解释是“SwitchMap从外部可观察值(由of运算符返回)中获取值,并将这些值作为参数传递给必须返回新可观察值的函数。”
arrayFromAjax.pipe(
  map((dataArray) => dataArray.map(data => data.login))
).subscribe(console.log);   // This is undefined