0

API エンドポイントを呼び出し、応答が到着したときに配列にデータを入力する Ember コードのスニペットがあります (API 呼び出しとは別に、配列に追加される他の項目があります。簡単にするために無関係なコードは省略しました)。

descriptor: Ember.computed("qParams", function(){
    let qParams = this.get("qParams");
    let data = new Ember.A();
    let callHomePromise = this.get("store").find('info-extractor', qParams)
    .then(item => { data.pushObject(item); });
    return data;
    })

このコードは正常に動作し、意図したとおりに動作します。リトライアを作成したいと思います。this.get("store").findたとえば、基になる AJAX 呼び出しが 401 で応答するために失敗した場合は、さらに数回試行します。この回答に基づいて

https://stackoverflow.com/a/51332115/1518685

次のラッパーを考案しました。

export default function (promiseFactory) {

  let retryChain = Ember.RSVP.reject();
  for (var count = 0; count < 3; count++) {
  retryChain = retryChain.catch(reason => {
      return new Ember.RSVP.Promise((resolver, rejector) => {
        promiseFactory().catch(r => {
        setTimeout(rejector.bind(null, reason), 1000);
      }).then(ok => { resolver(ok); })
      });
    });
  }

  return retryChain;
}

私は次の方法で実行します:

import retrier from 'project/utils/retrier';

//....

descriptor: Ember.computed("qParams", function(){
    let qParams = this.get("qParams");
    let data = new Ember.A();
    let callHomePromise = retrier(() => { 
         return this.get("store").find('info-extractor', qParams); 
        }).then(item => { data.pushObject(item); })
          .catch(reason => { /* do stuff with reason */});
    return data;
    })

不正なリクエストを (faulty 変数を設定して) シミュレートqParamsし、複数の AJAX リクエストが失敗するのを観察し、最終的に永続的な失敗がリトライ後に catch() メソッド内でキャプチャされます。

ただし、呼び出しが成功した場合、リトライアの約束は決して解決されず、理由がわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1