2016-11-27 52 views
0

繼承人我的原始代碼,基本上它試圖接受「貿易報價」,如果它失敗,它會被拒絕。我該如何在幾秒鐘的時間間隔內重複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異步等待(babel,TypeScript)可幫助您獲得更清晰的代碼。此外,因爲一個錯誤是在回調中傳播,就沒有必要使用try塊,除非你正在使用的API可能無法馬上,但通常不是在回調傳遞的風格。

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

感謝您的回答,對不起我的要求,但如果我從改變我的聲明「嘗試」,以「功能」喜歡你貼出來,會影響壞的方式我的代碼?在我的代碼中導致theres「catch」語句以及後面的 – Petras

+0

try/catch通常只捕獲代碼中的錯誤,例如設置爲未聲明的變量。在異步代碼中通常不需要它。除非你喜歡執行驗證和'throw',否則在你的代碼中嘗試捕獲是非常罕見的。我會說看看api,看它是否會拋出。無論哪種方式,你都需要在catch子句中做一些有用的事情。否則,你只需要一個全球性的uncaughtException處理程序https://nodejs.org/api/process.html#process_event_uncaughtexception –

+0

我真的不知道什麼是「扔」不過是我的,如果我的應用程序獲取對API一些負載崩潰和整個遺址mongodb的並且它具有重新開始 – Petras