2

私はAngular(1.4)サービスに少し問題があります。コードはおおよそ次のようになります。サービスを中止することを約束します

service.retrieveStuffFromServer = function() { 
     return httpCallFromServer().then(
      function(data) { 
       if (Array.isArray(data)) { 
        return data; 
       } 
       return []; 
      } 
     ); 
    }; 

私はこの機能を2つの異なるコントローラで呼び出します。意図したとおりの時間のほとんどは、それが動作しますが、私はそれらの条件に問題を抱えている:

  • HTTP呼び出しがデータを返すために時間がかかる
  • コントローラーAがサービスを呼び出します。
  • コントローラBがサービスを呼び出します。
  • サービスはコントローラAにデータを返します
  • コントローラBのコールはキャンセルされます。実行後のロジック

サービスを少し変更してサービスが既にビジー状態になっている場合は、どちらかのコントローラに通知して、後で再試行できますが、これが正しいかどうかわかりません最高の解決策、私はいくつかのアドバイスを探しています。

+0

2つの呼び出しが同じ結果、つまりキャッシュされるようにしますか? – dfsq

+0

ポイントは、任意のコントローラから一度だけサービスデータを呼び出すことですか?なぜコントローラBの呼び出しがキャンセルされたのですか? –

+0

その条件記述のどの部分がそれに到達するためのステップであり、問​​題のある動作は何ですか(そして、代わりに何が起こるべきですか)。 – Bergi

答えて

0

なぜちょうどうまくいかないのか分かりませんが、おそらくhttpCall()の何かが、同じ呼び出しが完了する前に再び同じ呼び出しができないようにしています。これは、以前の呼び出しから同じ約束は限り前に呼び出しがあるとして返されるようになります

function myFunction() { 
    if (!myFunction.promise) { 
    myFunction.promise = httpCall() 
     .then(function(result) { 
      myFunction.promise = undefined; 
      return ... 
     }, function(err) { 
      myFunction.promise = undefined; 
      throw err; 
     }); 
    } 
    return myFunction.promise; 
} 

:あなたがアクティブ前の呼び出しからの応答を共有するには、コントローラBの呼び出しをしたい場合しかし、あなたは約束をキャッシュすることができまだ解決されていません。

関数自体のプロパティをキャッシュとして使用すると、論理的に関数自体に状態を関連付けることができます。しかし、myFunctionの範囲外で定義された変数を使用することはできます。

+0

あなたはたぶん '' err'を投げて、それを ''返す ''にしたくないでしょう。代わりに '.finally'を使用してください。 – Bergi

+0

コードが書かれた瞬間とそれがAndroid/iOSで実行される瞬間にはいくつかのステップと変換があり、それがどうなるのか理由は分かりませんでした。 チャールズともう一度やり直す必要はありません。 お返事ありがとうございます、できるだけ早く試してみます。 – lbreakjai

+0

'finally'は実際の約束仕様の一部ではなく、ライブラリ固有の拡張です。私が約束しているライブラリがあれば、それはどこにあるのかわからないので、どこでも使えるコードを書くことにしました。 'catch'はOKですが、もっと短くはありません。返ってきたのは間違いだよ、ありがとう、固定! –

関連する問題