Javascript 无法在else语句死区结束后从开始启动路由

Javascript 无法在else语句死区结束后从开始启动路由,javascript,node.js,Javascript,Node.js,首先,我很抱歉,如果这已经张贴过。我搜索了一下,但找不到任何可靠的解决办法 所以我在nodejs中处理这个路由,我对一条信息进行API调用,然后在if语句中使用该信息来检查信息是否正确(服务器有时发送错误的信息) 如果我得到了正确的信息,那么我会在另一个API中使用它来获得更多关于它的信息,并将其呈现到我的模板中。一切正常 但是如果信息不匹配或错误,我希望第一个API调用再次发生。如何从一开始就再次启动API调用(如循环),并且只有在信息正确的情况下才会中断API调用。请检查下面代码中的“注释”

首先,我很抱歉,如果这已经张贴过。我搜索了一下,但找不到任何可靠的解决办法

所以我在nodejs中处理这个路由,我对一条信息进行API调用,然后在if语句中使用该信息来检查信息是否正确(服务器有时发送错误的信息)

如果我得到了正确的信息,那么我会在另一个API中使用它来获得更多关于它的信息,并将其呈现到我的模板中。一切正常

但是如果信息不匹配或错误,我希望第一个API调用再次发生。如何从一开始就再次启动API调用(如循环),并且只有在信息正确的情况下才会中断API调用。请检查下面代码中的“注释”。那就是我不知道该放什么的地方。非常感谢你的帮助

另外,我是nodejs和javascript的初学者

路线


我可能会这样做:

router.get('/check', (req, res) => {
  if (req.query.search) {
    var input = req.query.search;
    // Put this logic away in a `checkData` function
    checkData(input)
      .then(data => {
        res.render('index', { data }); // Short version of {data: data}
      })
      .catch(err => {
        console.error(err);
        res.render('index', { data: null });
      });
  } else {
    res.render('index', { data: null });
  }
});

// Here, we have a `retries` parameter, set to 0 initially
function checkData (input, retries = 0) {
  const maxRetries = 3;
  // Return a promise (you could also use callbacks)
  return new Promise((resolve, reject) => {
    // Define a retry method
    const retry = () => {
      if (retries < maxRetries) {
        // Increment the retries count and go for another try
        checkData(input, retries + 1).then(resolve).catch(reject);
      } else {
        reject(`Could not get the data after ${retries} retries.`);
      }
    };
    var url = `http://firstapi.com/json/${input}?fields=query`;
    request(url, function (error, response, body) {
      if (!error && response.statusCode === 200) {
        var data = JSON.parse(body);
        if (data.query.match(/((^|\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]?\d))){4}$/)) {
          var url = 'https://secondapi.com/' + data.query + '?key=something';
          request(url, function (error, response, body) {
            if (!error && response.statusCode === 200) {
              var Data = JSON.parse(body);
              // If it worked, resolve with the data
              resolve(Data);
            } else {
              retry();
            }
          });
        } else {
          retry();
        }
      }
    });
  });
}
router.get('/check',(req,res)=>{
if(请求查询搜索){
var输入=req.query.search;
//将此逻辑放在“checkData”函数中
检查数据(输入)
。然后(数据=>{
res.render('index',{data});//简短版本的{data:data}
})
.catch(错误=>{
控制台错误(err);
res.render('index',{data:null});
});
}否则{
res.render('index',{data:null});
}
});
//这里有一个'retries'参数,最初设置为0
函数检查数据(输入,重试次数=0){
常量maxRetries=3;
//返回承诺(也可以使用回调)
返回新承诺((解决、拒绝)=>{
//定义重试方法
常量重试=()=>{
如果(重试次数<最大重试次数){
//增加重试次数并进行另一次尝试
检查数据(输入,重试+1)。然后(解析)。捕获(拒绝);
}否则{
拒绝(`在${retries}次重试后无法获取数据。`);
}
};
变量url=`http://firstapi.com/json/${input}?字段=查询`;
请求(url、函数(错误、响应、正文){
如果(!error&&response.statusCode==200){
var data=JSON.parse(body);
if(data.query.match(/(^ |\)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]?\d)){4}$/){
var url='1〕https://secondapi.com/“+data.query+”?key=something';
请求(url、函数(错误、响应、正文){
如果(!error&&response.statusCode==200){
var Data=JSON.parse(body);
//如果有效,请使用数据进行解析
解析(数据);
}否则{
重试();
}
});
}否则{
重试();
}
}
});
});
}

伙计,你是个天才。太棒了。虽然这个函数是waayyyyy,我不喜欢它,而且超出了我的想象,但它确实有效。我会学的。我真是太感谢你了。其实没什么大不了的,但我很高兴它起到了作用:)A只是回调的替代品。但是,当它成功时,它可以使用值
解析
,当它失败时,它可以使用错误
拒绝
。如果成功,则执行
中的函数,然后执行
,否则执行
catch
中的函数。如果您愿意,我可以制作一个使用回调的版本,但我鼓励您了解承诺,在很多情况下,它将使您的代码更可读(链接而不是包装)不,这很好。这对你来说是一个很大的要求。你已经帮了很多忙了。另外,我认为在我了解了Promises和JS的其他新特性之后,如果我能自己破解这段代码,那就太好了。但是你能推荐一个我可以学习或练习高级JS的平台吗?很抱歉,我不使用任何平台,我每天都会在media.com上偶然读到一篇文章,从同事那里获得反馈或查看代码,寻找在StackOverflow上做事情的方法,在谷歌上找到的各种网站上学习教程。。。下面是一个描述
router.get('/check', (req, res) => {
  if (req.query.search) {
    var input = req.query.search;
    // Put this logic away in a `checkData` function
    checkData(input)
      .then(data => {
        res.render('index', { data }); // Short version of {data: data}
      })
      .catch(err => {
        console.error(err);
        res.render('index', { data: null });
      });
  } else {
    res.render('index', { data: null });
  }
});

// Here, we have a `retries` parameter, set to 0 initially
function checkData (input, retries = 0) {
  const maxRetries = 3;
  // Return a promise (you could also use callbacks)
  return new Promise((resolve, reject) => {
    // Define a retry method
    const retry = () => {
      if (retries < maxRetries) {
        // Increment the retries count and go for another try
        checkData(input, retries + 1).then(resolve).catch(reject);
      } else {
        reject(`Could not get the data after ${retries} retries.`);
      }
    };
    var url = `http://firstapi.com/json/${input}?fields=query`;
    request(url, function (error, response, body) {
      if (!error && response.statusCode === 200) {
        var data = JSON.parse(body);
        if (data.query.match(/((^|\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]?\d))){4}$/)) {
          var url = 'https://secondapi.com/' + data.query + '?key=something';
          request(url, function (error, response, body) {
            if (!error && response.statusCode === 200) {
              var Data = JSON.parse(body);
              // If it worked, resolve with the data
              resolve(Data);
            } else {
              retry();
            }
          });
        } else {
          retry();
        }
      }
    });
  });
}