5

ng2 http プロバイダー Observable.toPromise() サポートを使用して promise 対応メソッドを呼び出すと、期待どおりに動作しますが、promise チェーンの一部として使用すると、then ハンドラーが処理して結果を返す前に、返された promise が解決されます。

Observable.toPromise() をプロミス チェーンで動作させることに関する既知の問題、またはプロミス チェーンと互換性のある結果にするためにテストする代替方法はありますか? http リクエスト、promise チェーンの最後のアイテムが非同期リクエストを完了して結果を返す前に、この解決中の promise によってブロックされています。

例えば

this.myService.getSomethingInvolvingingMultiplePromiseCalls().then(result => {
    let valueFromSomethingInvolvingMultiplePromiseCalls = result;
}, err => { 
    console.error('landed in app.component outer promise rejected handler, see output window for details')
})

public getSomethingInvolvingingMultiplePromiseCalls(): Promise<string> {
    return this.getSomethingInvolvingPromiseCall().then(resultPromise1 => {
        let resultPromise1propertyFoo = resultPromise1.propertyFoo;
            return this.getSomethingInvolvingNg2HttpProviderToPromiseCall(resultPromise1propertyFoo);
        }
        .then(resultPromise2 => {
            let resultPromise2propertyBar = resultPromise2.propertyBar;
            return resultPromise2propertyBar;
        }   
    }

getSomethingInvolvingNg2HttpProviderToPromiseCall(arg1: string): Promise<string> {
   let body = 'some body content leveraging arg1';
   let headers = new Headers({ 'Authorization': 'Bearer ' + accessToken, 'Content-Type': 'application/x-www-form-urlencoded' });
   let options = new RequestOptions({ headers: headers });

   return this.http.post(resourceBaseAddress + '/someRestApi', body, options).toPromise().then(response => {
        let responseJson = response.json();
        return responseJson['someJsonProperty'];
      });
    }
}

洞察や提案をお寄せいただきありがとうございます。

4

2 に答える 2

5

これに対する解決策を見つけました。

それには、angular2 http プロバイダー toPromise() を使用してメソッドを呼び出すためのハンドラーの内部に到達した場合にのみ解決を制御する typescript 遅延プロミスを作成して返す必要がありました。

他の Promise チェーン シナリオとは関係ありませんでしたが、何らかの理由でこの場合、チェーン内の http プロバイダー toPromise() 呼び出しが完了するまでメソッド呼び出し元をパークすることが許可されています。

public getSomethingInvolvingingMultiplePromiseCalls(): Promise<string> {
    let resolveFn, rejectFn;
    let promise = new Promise((resolve, reject) => { resolveFn = resolve; rejectFn = reject; });

    this.getSomethingInvolvingPromiseCall().then(resultPromise1 => {
        this.getSomethingInvolvingNg2HttpProviderToPromiseCall(resultPromise1).then(resultPromise2 => resolveFn(resultPromise2));
    }

    return promise;  // return the promise for outside callers to wait on
}
于 2016-03-05T17:12:09.350 に答える
1

promise チェーン内のオブザーバブルの以下の作業例を参照してください。

var promise = new Promise((resolve, reject) => {
  resolve(3)
}).then((num) => {
  return Rx.Observable.create((observer) => {
    setTimeout(() => {
      observer.next(5);
      observer.onCompleted();
    }, 0)
  }).toPromise()
}).then((num) => {
  return num * 2;
})

promise.then((number) => {
  alert(number);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.7/rx.all.js"></script>

あなたの使用.toPromise()observer.onCompleted()呼び出されなければならない場合の1つの落とし穴。約束を完了しないオブザーバブルを変換すると、解決されません。

于 2016-02-20T22:13:46.303 に答える