javascript - 为什么过滤 observable 订阅的结果会得到与过滤 observable 本身不同的结果

标签 javascript filter rxjs observable

我正在使用此代码:

var rx = require('rxjs');
var fetch = require('isomorphic-fetch');

var urls = [
  'http://gundam.wikia.com/api/v1/Navigation/Data'
];

var gundams = rx.Observable
  .from(urls)
  .flatMap(x => fetch(x))
  .flatMap(x => x.json())
  .map(x => x.navigation.wiki)
  .filter(x => x.text === "Mobile Weapons");

gundams.subscribe(
  (n) => console.log(n),
  (e) => console.log(e),
  (d) => console.log('done')
);

目前我没有在控制台中记录任何结果(“完成”除外)。

如果我删除可观察对象上的最后一条链 (.filter(x => x.text === "Mobile Weapons");) 并更改

(n) => console.log(n),

(n) => console.log(n.filter(x => x.text === "移动武器")),

我将预期结果记录到控制台

[ { text: '移动武器', href: '/wiki/Special:RunQuery/Weapon_query', 子级: [ [对象], [对象], [对象], [对象] ] } ]

我可能只是误解了可观察量的工作原理,但我很好奇如何更改我的代码,以便不必在订阅回调中使用过滤器。

最佳答案

这是因为 map 返回对象数组,因此您的过滤函数接收的是该数组,而不是您尝试过滤的数组内容。

这与您在订阅中执行过滤器时起作用的原因相同。由于 map 返回对象数组,您可以过滤该数组并且它按预期工作。

您需要使用flatMap,以便过滤器接收数组中的项目而不是数组。

var urls = [
  'http://output.jsbin.com/qimutofedi.json'
];

var gundams = Rx.Observable
  .from(urls)
  .flatMap(x => fetch(x))
  .flatMap(x => x.json())
  .flatMap(x => x.navigation.wiki) // <--- flatten out the array to emit its values
  .filter(x => x.text === "Mobile Weapons");

gundams.subscribe(
  (n) => console.log(n),
  (e) => console.log(e),
  (d) => console.log('done')
);

上面将记录:

Object {text: "Mobile Weapons", href: "/wiki/Special:RunQuery/Weapon_query",children: Array[4]}
children:Array[4]
href:"/wiki/Special:RunQuery/Weapon_query"
text:"Mobile Weapons"
__proto__:Object

jsbin example

关于javascript - 为什么过滤 observable 订阅的结果会得到与过滤 observable 本身不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37876954/

相关文章:

javascript - 在悬停图像上它应该播放视频

javascript - 根据用户输入的另一行的值在表中插入一行

python - 如何使用 python XPath 返回带有过滤子元素的父元素

JavaScript 过滤器返回 true 但不过滤

php - 如果键包含(匹配)一个或多个子字符串,如何从 PHP 数组中删除键值对

angular - 我应该为不同的订阅使用多个 BehaviorSubject 吗?

javascript - 为什么可观察源在竞赛(或合并)中使用时不发出值,但在我手动订阅它时发出值

javascript - API 应为 %100 同步或 %100 异步示例

Angular 组件 : Can I use an Observable instead EventEmitter as @Output() property?

javascript - 使用 easeljs pan 的 HTML5 Canvas