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

我在找什么。谢谢! –