0

Angular 2 の 2 つの別々のオブザーバブルに対する 2 つの連続したサブスクリプションに問題があります。次のことを試みています。

  1. 座標から位置を取得する
  2. この場所を私のjsonに添付してください
  3. jsonをサーバーに送信

私がそれを行う方法は、私が間違っていると信じていることです:

this._locationService.geocode(this.location.latitude, this.location.longitude).
        subscribe(position => {
            this.location.city = this.findAddressPart(position, "locality", "long");
            this.location.country = this.findAddressPart(position, "country", "long");
            this._locationService.updateLocation(this.location)
                .subscribe(
                    location => {
                        this.location = location;
                        this.submitted = true;
                        this.submitting = false;
                    }
                );
        });

このようにして、実際に場所を取得してから 5 ~ 10 秒で DOM が更新されます。

4

1 に答える 1

0

ソリューションの更新にかかる時間に問題があるようです。残念ながら、_locationServiceデータの使用方法を再構築しない限り、これを回避する方法はありません。現在、次のものがあります。

  1. 緯度と経度からジオコードを取得する
  2. リクエストが完了するのを待つ
  3. リクエスト #1 から location にデータを設定する
  4. 場所から更新データを取得する
  5. リクエストが完了するのを待つ
  6. 更新場所を設定する
  7. 更新された場所で DOM を更新する

2 つの要求が連鎖しています。可能であれば、バックエンドで 2 つの関数を 1 つの呼び出しに結合して、次のようなものを呼び出すことができるようにします。

this._locationService.geocode(this.location.latitude, this.location.longitude).
        subscribe(location => {
            this.location = location;
            this.submitted = true;
            this.submitting = false;
        });

もちろん、これは、サーバーにこのタイプのリクエストを処理するためのデータが含まれている場合にのみ機能します。サーバーも HTTP 呼び出しを行う必要がある場合、上記に変更することは意味がありません。

上記が不可能な場合は、最初のリクエストが完了した後に DOM を更新できます。すべてがうまくいけば、updateLocation関数はとにかくサーバーに送信されたのと同じ場所を返しますよね? DOM をローカルで使用可能な値で更新し、2 番目の関数が成功したときに DOM を更新する代わりに、エラーが発生した場合にのみ変更することができます。これにより、応答時間が 50% 速くなるように見えます。このようなもの。

this._locationService.geocode(this.location.latitude, this.location.longitude).
        subscribe(position => {
            this.location.city = this.findAddressPart(position, "locality", "long");
            this.location.country = this.findAddressPart(position, "country", "long");
            // SET DOM HERE using this.location values
            this._locationService.updateLocation(this.location)
                .subscribe(
                    location => {
                        this.location = location;
                        // optionally SET DOM HERE again
                        this.submitted = true;
                        this.submitting = false;
                    }, 
                    error => {
                        // SET DOM HERE reflecting error
                    }
                );
        });
于 2016-09-24T11:23:49.390 に答える