【问题标题】:api call in a loop until response is success [duplicate]api调用循环直到响应成功[重复]
【发布时间】:2019-06-28 03:26:32
【问题描述】:

我正在尝试从我的 nodejs 脚本中调用 rest API。我希望脚本继续重复调用这个 api,直到我得到一个肯定的结果。 这是我正在尝试做的,但我的脚本只是冻结:

var success=0;

while(!success){

  axios.post('http://localhost:2000/evaluate', {serviceName:"s1"})
       .then((response)=>{
          if(response.data==1){
            success=1; //desired response, quit the loop
            res.send('1')
          }
          else{ //not the desired response, keep trying
            res.send('0') 
          }

}//end while loop

基本上,我怎样才能进行重复的 API 调用,直到得到我想要的响应??

谢谢!

【问题讨论】:

  • 只需使用 setInterval

标签: javascript node.js express axios


【解决方案1】:

将success 替换为重试计数器,并在必要时通过回调再次调用该函数。如果出现任何问题,也要保持计数器不会陷入无限循环。

// your callback gets executed automatically once the data is received
var callback = (data, error) => {
    // consume data
    if (error) {
        console.error(error);
        return;
    }
    console.log(data);
};

// run the request. this function will call itself max. 5 times if the request fails
request(5, callback);

function request(var retries, var callback) {
    axios.post('http://localhost:2000/evaluate', {
        serviceName:"s1"
    }).then(response => {
        // request successful

        if(response.data['done'] == 1) {
            // server done, deliver data to script to consume
            callback(response);
        }
        else {
            // server not done yet
            // retry, if any retries left
            if (retries > 0) {
                request(--retries, callback);
            }
            else {
                // no retries left, calling callback with error
                callback([], "out of retries");
            }
        }
    }).catch(error => {
        // ajax error occurred
        // would be better to not retry on 404, 500 and other unrecoverable HTTP errors
        // retry, if any retries left
        if (retries > 0) {
            request(--retries, callback);
        }
        else {
            // no retries left, calling callback with error
            callback([], error);
        }
    });
}

【讨论】:

  • 这太棒了!,只有一个问题..如果需要,请求函数如何将数据传递给另一个函数..我的意思是代替 res.send(),假设我必须返回值到脚本后面的另一个函数。
  • 您可能还需要考虑在重试之间等待,以免服务器过载(请参阅docs.aws.amazon.com/general/latest/gr/api-retries.html)
  • 这真是个好主意!
  • @anuragb26 我补充了一些信息,希望能帮助你理解:)
  • 不客气,我很高兴能帮上忙!请记住接受正确的答案,欢迎来到 SO :)
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 2012-05-02
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多