我现在正在发现RxJS,我的第一次尝试就是试图对API请求进行速率限制。
不知何故,我错过了一些东西并且输入了输出#34; undefined"。
我做错了什么?
const Rx = require('rx');
const request = require('request');
function f() {
return Rx.Observable.from(arguments);
}
function expand(condensedId) {
console.log('requesting', condensedId)
return f(request(INDEX_URL + '/' + condensedId));
}
const INDEX_URL = 'http://jsonplaceholder.typicode.com/posts';
var source = f([1,2,3,4,5,6,7])
.windowWithTimeOrCount(5000, 2)//rate limitation, 2 every 5 seconds
.flatMap(condensed => expand(condensed))
.map(entry => entry.title);
var subscription = source.subscribe(
function (x) {
console.log('title: %s', x);
},
function (err) {
console.log('Error: %s', err);
},
function () {
console.log('Completed');
});
答案 0 :(得分:0)
Rx.Observable.from
期望可迭代,我不认为对request()
的回复是可迭代的。您可以将一个返回Promise或Observable的函数传递给flatMap
,它将返回一个将发出已解析数据的流。
因此,我们使用request-promise
代替request
并在expand
函数中返回Promise。另外,让我们使用cheerio
库来提取html标题:
const Rx = require('rx');
const request = require('request-promise');
// HTML parsing library
const cheerio = require('cheerio');
function f() {
return Rx.Observable.from(arguments);
}
const INDEX_URL = 'http://jsonplaceholder.typicode.com/posts';
// Return an Observable of resolved responses
function expand(condensedId$) {
return condensedId$.flatMap(id => request(INDEX_URL + '/' + id));
}
var source = f([1,2,3,4,5,6,7])
.windowWithTimeOrCount(5000, 2)//rate limitation, 2 every 5 seconds
.flatMap(condensed => expand(condensed))
.map(body => {
const $ = cheerio.load(body);
return $('title').text();
});