2017-07-25 5 views
0

このコードはトリプル(重要ではない)を解析し、一度に1つの駐車場を返すべきです。問題はobserver.next()を呼び出すとループが1回だけ実行されるため、ループが中断されることです。 console.logも呼び出されません。私はおそらく何かが不足していますが、observer.next()がループを壊す可能性はありますか?エラーがありますか、それとも機能ですか、それとも間違っていますか?Observable.next()breaksループ

return Observable.create(observer => { 
    this.fetch.get(datasetUrl).then(response => { 
    // Get all subjects that are parkings 
    const parkingTriples = [], 
     parkings = [], 
     totalspacesParking = [], 
     labels = []; 
    for (let index = 0; index < response.triples.length; index++) { 
     if (response.triples[index].object === 'http://vocab.datex.org/terms#UrbanParkingSite') { 
     parkingTriples.push(response.triples[index]); 
     } 
     if (response.triples[index].predicate === 'http://vocab.datex.org/terms#parkingNumberOfSpaces') { 
     totalspacesParking.push(response.triples[index]); 
     } 
     if (response.triples[index].predicate === 'http://www.w3.org/2000/01/rdf-schema#label') { 
     labels.push(response.triples[index]); 
     } 
    } 
    const _parkings = []; 
    for (let index = 0; index < parkingTriples.length; index++) { 
     const totalspacesresult = find(totalspacesParking, (o) => { 
     return o.subject === parkingTriples[index].subject 
     }); 
     const totalspaces = parseInt(n3.Util.getLiteralValue(totalspacesresult.object), 10); 
     const labelresult = find(labels, (o) => { 
     return o.subject === parkingTriples[index].subject 
     }); 
     const rdfslabel = n3.Util.getLiteralValue(labelresult.object); 
     const id = rdfslabel.replace(' ', '-').toLowerCase(); 
     observer.next(new Parking(rdfslabel, parkingTriples[index].subject, id, totalspaces, datasetUrl)); 
     console.log(observer); 
    } 

    }) 
}) 
+0

問題を簡略化したり、テストケースを提供できますか?一般的に 'observer.next()'はあなたのコードを壊してはいけません。 –

+0

@MarkvanStraten 'for(let index = 0; index

+0

「オブザーバー」の署名は何ですか?通常の 'Rx.Subject'を使用すると簡略化されたテストケースが動作します –

答えて

1

更新されたコードがあれば、それをデバッグすることをお勧めします。バグはRxビットにない可能性が高いです。私は、受信ロジックと応答解析の間で分割するようにコードをリファクタリングしている:

function getParkings(datasetUrl){ 
    return Rx.Observable.defer(() => this.fetch.get(datasetUrl)) 
    .mergeMap(response => parseParkingResponse(response)); 
} 

function parseParkingResponse(response) { 
    const parkingTriples = [], 
    parkings = [], 
    totalspacesParking = [], 
    labels = []; 
    for (let index = 0; index < response.triples.length; index++) { 
    if (response.triples[index].object === 'http://vocab.datex.org/terms#UrbanParkingSite') { 
     parkingTriples.push(response.triples[index]); 
    } 
    if (response.triples[index].predicate === 'http://vocab.datex.org/terms#parkingNumberOfSpaces') { 
     totalspacesParking.push(response.triples[index]); 
    } 
    if (response.triples[index].predicate === 'http://www.w3.org/2000/01/rdf-schema#label') { 
     labels.push(response.triples[index]); 
    } 
    } 

    const _parkings = []; 
    for (let index = 0; index < parkingTriples.length; index++) { 
    const totalspacesresult = find(totalspacesParking, (o) => { 
     return o.subject === parkingTriples[index].subject 
    }); 
    const totalspaces = parseInt(n3.Util.getLiteralValue(totalspacesresult.object), 10); 
    const labelresult = find(labels, (o) => { 
     return o.subject === parkingTriples[index].subject 
    }); 
    const rdfslabel = n3.Util.getLiteralValue(labelresult.object); 
    const id = rdfslabel.replace(' ', '-').toLowerCase(); 
    _parkings.push(new Parking(rdfslabel, parkingTriples[index].subject, id, totalspaces, datasetUrl)); 
    } 

    return _parkings; 
} 

これは、簡単に何が起こっているかをデバッグするようになります。

+0

このコードは機能します!しかし、それは配列をストリーミングしている。私は駐車場を1つずつストリーミングして、ループ自体に –

+0

のoberserver.next(new Parking())を呼び出したいと思います。駐車場のアイテムと非同期で動作しない限り、 'parseParkingResponse'は同期されますので、ストリーミングは行われません異なる –

1

一般にSubjectはコードを壊さないでしょう。次を考える:

const observer = new Rx.Subject(); 
 
const parkingTriples = new Array(10); 
 

 
observer.subscribe(val => console.log('value emitted: ' + val)); 
 

 
for (let index = 0; index < parkingTriples.length; index++) { 
 
    observer.next(index); 
 
    console.log('I still get hit through'); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.2/Rx.js"></script>

これはI still get hit throughたびに放出されます。ほとんどの場合observerはコードで定義されていないので、observer.next()ブレークを呼び出し、次のconsole.logは表示されません。

関連する問題