8

AJAX ストリームの読み込みインジケータを表示する「Rx」の方法に頭を悩ませています。

$scope.$createObservableFunction("load")
        .take(1)
        .do(function(){
            $scope.loading = true;
        })
        .flatMap(contentService.AJAX_THINGY_AS_OBSERVABLE)
        .delay(300)
        .subscribe(function(content){
            console.log("content",content);
        },function(error){
            $scope.error = error
        },function() {
            $scope.loading = false;
        });

私が理解している限り、.do()副作用に使用する必要がありますloadingが、設定はそうであると思いますが、正しいやり方ではないように感じます。

これを行う方法のよりクリーンな/より良い/適切な例を誰かが提供できますか?

ありがとう!

更新 1

これを 2 つのストリームに分割することにしました。requestSourceresponseSource

var loadRequestSource = $scope.$createObservableFunction("load")
    .share();

var loadResponseSource = loadRequestSource
    .flatMap(contentService.AJAX_THINGY_AS_OBSERVABLE)
    .throttle(1000)
    .share();

次に、2 つの個別のサブスクライバーを用意します。

loadRequestSource.subscribe(function () {
    $scope.loading = true;
});

loadResponseSource.subscribe(function (response) {
    /* enter logic */
    $scope.loading = false;
    $scope.$digest();
}, function (err) {
    $scope.error = err;
    $scope.loading = false;
    $scope.$digest();
});

サブスクライブの役割を正確に保つため、このアプローチが気に入っています。loading応答サブスクライバーは、 への設定を気にする必要はありませんtrue。に設定することだけを気にしfalseます。

4

1 に答える 1