2016-11-27 4 views
0

私の生のコードでは、基本的に "Trade offer"を受け入れようとしますが、失敗すればそれは拒否されます。 2回目のインターバルで同じ「トレード・オファー」でこの声明を10回再試行させるにはどうすればいいのですか?ノードでtry文を正しく再試行する方法は?

try { 
    offers.acceptOffer({tradeOfferId: offer.tradeofferid}, function(err, log) { 
     if (err) { 
      helper.log('Error accepting trade offer ' + offer.tradeofferid, 891, err); 
      offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() { 
       currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1); 
      });  
      return; 
     } 
+1

これは非同期のため再帰です。 'try' /' catch'はとにかく動作しないことに注意してください。 – Bergi

答えて

0

コールバックにはsetTimeout()と何かがあります。約束事、あるいはES2017 async-await(babel、TypeScript)さえあれば、きれいなコードを手に入れることができます。また、コールバックにエラーが伝播するため、使用しているAPIがすぐに失敗する可能性はありませんが、通常はコールバックを渡すスタイルではない限り、tryブロックを使用する必要はありません。

function putOffer(maxRetries) { 
    offers.acceptOffer({tradeOfferId: offer.tradeofferid}, function(err, log) { 
     if (err) { 
      if (maxRetries > 0) { 
       setTimeout(function() { putOffer(maxRetries - 1); }, 2000); 
       return; 
      } 
      helper.log('Error accepting trade offer ' + offer.tradeofferid, 891, err); 
      ... 
      return; 
     } 
    }); 
} 

putOffer(10); 
+0

答えをありがとう、申し訳ありませんが、あなたが投稿したように "try"から "function"にステートメントを変更した場合、それは悪い方法で自分のコードに影響しますか?私のコードのtheres "キャッチ"文も後で – Petras

+0

に入れます。通常、try/catchは、宣言されていない変数に設定するなど、コード内のバグをキャッチします。非同期コードでは、通常、その必要はありません。バリデーションや 'スロー'をしたいのでなければ、コード内でtry catchを行うのは非常にまれです。私はそれがスローすることができるかどうかを確認するapiを見てみましょう。いずれにしても、catch節で行うのに便利な何かを持つ必要があります。それ以外の場合は、グローバルuncaughtExceptionハンドラが必要です。https://nodejs.org/api/process.html#process_event_uncaughtexception –

+0

「投げる」ことは実際にはわかりませんが、私のアプリがAPIに負荷をかけるとクラッシュし、全体が壊れますMongoDBのと、それはそれは、コンソール上のように見える相続人はどのように – Petras

関連する問題