저는 반응 형 프로그래밍을 처음 접했고 짧은 코드 스 니펫에 대한 의견을 듣고 Rx 사고 방식에서 얼마나 멀리 떨어져 있는지보고 싶습니다.코드 검토 : 다음 rxjs 원칙입니까?
제 목적은 한 번에 최대 500 개 항목을 반환하는 웹 서비스에서 약 2245 개의 항목을 가져 오는 것입니다. 그래서 여러 번 전화를 걸어 모든 결과를 연결해야합니다.
$ .getJSON에서 반환 한 모든 약속을 배열에 저장 한 다음 forkJoin 메서드를 사용하여 결과를 모두 처리합니다.
// get the exact total number of items
function getCount() {
return $.get({
url: '/sites/_api/items/count',
contentType: "application/json;odata=verbose",
headers: { "Accept": "application/json;odata=verbose" }
});
}
getCount().done(function (result) {
var promises = []; // store promises
var total = result.d.ItemCount; // total number of items
var batch = 500; // number of items to fetch for each request
var count = Math.ceil(total/batch); // number of request needed
for (var i = 0; i < count; i++) {
var skip = batch * i; // number of item already fetched
var top = batch * (i + 1) > total ? (total % batch) : batch; // number of item to fetch
var p = $.getJSON("/sites/_api/items?$select=" + fieldname + "&$skip=" + skip + "&$top=" + top); // get promise
promises.push(p); // store promise in dedicated array
}
// join all promises and handle all results at once
Rx.Observable.forkJoin(promises).subscribe(function (result) {
console.log(result); //[object, object, object, object, object]
});
});
이렇게하면 예상되는 결과가 나오지만 Rx를 사용하여 더 좋은 방법이 있다면 의견을 듣고 싶습니다.
------ EDIT --------- 스트림 개념을 기반으로 한 첫 번째 시도 코드를 추가합니다. 의미 나는 알 수없는 번호의 요청을합니다. 그들이 온 것처럼 결과를 더할 것이고 (onDataReceived 함수를 보라), 끝날 때 결과를 전체적으로 다룰 것이다. 나는 모든 요청이 완료되었음을 알리는 방법을 발견 할 수 없었고 관찰 가능 항목의 '완료된'방법을 시작했다.
var items = [];
var obs;
function onDataReceived(data) {
obs.onNext(data);
}
function getFieldValue(fieldname, skip, top) {
var uri = "/sites/_api/items?&$skip=" + skip + "&$top=" + top;
$.getJSON(uri, onDataReceived);
}
function getCount() {
return $.get({
url: '/sites/_api/items/count',
contentType: "application/json;odata=verbose",
headers: { "Accept": "application/json;odata=verbose" }
});
}
obs = new Rx.Subject();
obs.subscribe(
function (value) { items = items.concat(value.d); },
function (err) { console.err(err); },
function() { console.log("completed" + items.length); }
);
getCount().done(function (result) {
var total = result.d.ItemCount;
var batch = 500;
var count = Math.ceil(total/batch);
for (var i = 0; i < count; i++) {
var skip = batch * i;
var top = batch * (i + 1) > total ? (total % batch) - 1 : batch;
getFieldValue(skip, top);
}
});
가 나는 http://codereview.stackexchange.com/에 답변 –