技術的背景
Web ブラウザーで jQuery を使用して、ログから一連のエントリを返す API を呼び出しています。
API リクエストは次の 2 つのパラメータを取ります。
offset_timestamp
: 必要な最も早いエントリを指定する整数limit
: 返すレコード数を指定する整数
リクエストとレスポンスの例
Request with parameters:
- offset_timestamp = 100
- limit = 50
curl "https://example.com/log?offset_timestamp=100&limit=5"
Resulting JSON Response:
{
next_timestamp: 222,
end_of_log: false,
entries: [
{
timestamp: 111,
data: { ... }
},
{
timestamp: 112,
data: { ... }
},
...
{
timestamp: 160,
data: { ... }
}
]
}
単純な jQuery + コールバックを使用していた場合、AJAX 呼び出しを再帰的に連鎖させる必要があると思います。次のようなもの:
// NOTE: I have NOT tested this code.
// I just wrote it for illustration purposes
function getBatch(offset, limit, callback) {
var url = "https://example.com/logs?offset_timestamp=" + offset + "&limit=" + limit;
var ajaxParams = {
method: "GET",
url: url
};
jQuery.ajax(ajaxParams))
.done(function(data) {
if (data.end_of_log) {
return callback(data.entries);
}
return getBatch(data.next_timestamp, limit, function(entries) {
return callback(entries.concat(data.entires));
});
});
}
function processEntries(entries) {
for (var i = 0; i < entries.length; i++) {
console.log(i.data);
}
}
getBatch(0, 50, processEntries);
flatMap()
当然のことながら、すべてのエントリのシーケンスを取得するために使用できるように、Observable のシーケンス (それぞれがエントリのバッチを 1 つ保持) を使用したいと考えています。
質問
jQuery 呼び出しから Observable を作成する場合、たとえばRx.Observable.fromPromise(jQuery.ajax({...}))
、RxJS を使用してresponse.next_timestamp
、後続の呼び出しのパラメーターで前の呼び出しの値を使用して、これらの Observable を任意の数だけチェーンすることは可能ですか?