2017-08-02 86 views
1

我正在訪問一個稍有不足的API端點。大約70%的時間它發回正確的JSON響應,但有幾次它會發出一個XML併發送「值/值」。我想做一個while循環什麼請求,直到它得到正確的迴應。就我而言,我保證最終會得到正確的響應,所以這就是爲什麼我要循環而不是弄清楚端點爲什麼要退出。NodeJs - 使用請求模塊在一個while循環中有條件地發出'GET'請求

這裏是我的代碼:

var gotValidResponse = false; 

while(!gotValidResponse){ 
    request(options, function(err, res, body){ 
     if(err){ 
      console.log(err); 
      return; 
     } 

     try{ 
      data = JSON.parse(body); 
      console.log(data); 
      gotValidResponse = true; 
     }catch(e){ 
      console.log('trying again'); 
     } 
    }); 
} 

processJSON(data); 

顯然上面的代碼不工作,但希望它顯示什麼,我試圖做的。謝謝你的幫助!

編輯:像這樣?

var myData = getStuff(options); 

function getStuff(options){ 
    request(options, function (err, res, body) { 
     if (err) { 
      console.log(err); 
      return 
     } 

     try { 
      data = JSON.parse(body); 
      return data; 
     } catch (e) { 
      return getStuff(options); 
     } 
    }) 
} 
+2

那麼,絕對不要這樣做,永遠。 while循環會在實際返回之前發送很多請求(因爲'request'是異步和全部的) - 你應該做的是做一個請求的方法,然後在響應中執行檢查,如果它是不是你想要的,再次調用該方法。這樣,每個請求在另一個被觸發之前完成。在你的例子中,如果服務器關閉,它只會無限請求。 – tymeJV

+0

感謝您的回覆。你能看看我的編輯,並告訴我,如果這是你的意思? –

+4

你正在做一個異步請求,你不會像你想象的那樣得到返回值。你需要使用回調或承諾 – Paul

回答

1

你在編輯中幾乎是正確的。你需要做的是繼續調用該函數,直到它返回你想要的。像這樣(我的條件語句僅是說明性的):

var attemps = 1; 
var fake = function(data, cb) { 
    console.log('Attemp nº', attemps); 

    if(attemps < 5) { 
    attemps += 1; 
    return fake(data, cb); 
    } else { 
    return cb(null, 'completed'); 
    } 
} 

fake('whatever', function(err, res) { 
    console.log(res) 
}) 

https://jsfiddle.net/eysu2amp/

如果您檢查控制檯,您將看到假的函數被調用5次,然後返回數據。函數的遞歸調用保持傳遞相同的回調函數。

+1

我在找什麼。謝謝! –