Node.js 如果出现错误,如何再次执行该方法
如果方法Node.js 如果出现错误,如何再次执行该方法,node.js,typescript,Node.js,Typescript,如果方法getApiGoogleDesktop收到错误,我想无限次地再次运行它 class PsiController { public async getApiGoogleDesktop(req: Request, res: Response) { console.log('Consumiendo API Google Desktop... '); let url = `${urlParams.url}?url=${urlParams.psiUrl}&key=$
getApiGoogleDesktop
收到错误,我想无限次地再次运行它
class PsiController {
public async getApiGoogleDesktop(req: Request, res: Response) {
console.log('Consumiendo API Google Desktop... ');
let url = `${urlParams.url}?url=${urlParams.psiUrl}&key=${urlParams.key}&category=${urlParams.category[1]}&strategy=${urlParams.strategy[1]}&locale=${urlParams.locale}`;
await Request.get(url, (error: any, response: any, body: any) => {
if (error) {
return error;
}
let data = JSON.parse(body);
if (data.error) {
console.log(data.error);
Request.get('http://localhost:3000/api/psi/desktop')
}
// ...
return res.send(data);
})
}
}
添加一个
while
循环,首先在循环外部设置url
,然后在循环内部设置错误。我会这样做:
class PsiController {
public async getApiGoogleDesktop(req: Request, res: Response) {
console.log('Consumiendo API Google Desktop... ')
let url = `${urlParams.url}?url=${urlParams.psiUrl}&key=${urlParams.key}&category=${urlParams.category[1]}&strategy=${urlParams.strategy[1]}&locale=${urlParams.locale}`
const data = await makeRequest(url)
return res.send(data)
async function makeRequest(url) {
return new Promise<any>((resolve, reject) => {
Request.get(url, (error: any, response: any, body: any) => {
if (error) {
return error
}
let data = JSON.parse(body)
if (data.error) {
console.log(data.error)
return makeRequest('http://localhost:3000/api/psi/desktop')
}
// ...
return resolve(data)
})
})
}
//...
类控制器{
公共异步getApiGoogleDesktop(请求,响应){
log('consumiendoapi谷歌桌面…'))
设url=`${urlParams.url}?url=${urlParams.psiUrl}&key=${urlParams.key}&category=${urlParams.category[1]}&strategy=${urlParams.strategy[1]}&locale=${urlParams.locale}`
const data=wait makeRequest(url)
返回res.send(数据)
异步函数makeRequest(url){
返回新承诺((解决、拒绝)=>{
获取(url,(错误:任意,响应:任意,正文:任意)=>{
如果(错误){
返回错误
}
让data=JSON.parse(body)
if(data.error){
console.log(data.error)
返回makeRequest('http://localhost:3000/api/psi/desktop')
}
// ...
返回解析(数据)
})
})
}
//...
使用“递归”函数来完成此任务。在这种情况下,您可以使用回调式函数,这将很容易实现和理解
class PsiController {
public async getApiGoogleDesktop(req: Request, res: Response) {
console.log('Consumiendo API Google Desktop... ');
let url = `${urlParams.url}?url=${urlParams.psiUrl}&key=${urlParams.key}&category=${urlParams.category[1]}&strategy=${urlParams.strategy[1]}&locale=${urlParams.locale}`;
const whenSuccess = (data) => { // callback in success case
res.send(data);
}
const whenError = (error) => { // callback in error case. We catch "system" error like NetworkError
res.status(500).send(error);
}
const forceRequest = (url: string, onSuccess: (data) => void, onError: (error) => void) => { // the recursion function
Request.get(url, (error: any, response: any, body: any) => {
if (error) {
return onError(error); // stop
}
let data = JSON.parse(body);
if (data.error) {
console.log(data.error);
return forceRequest(url, onSuccess, onError); // retry with original params
}
// ...
onSuccess(data); // stop when successfully
})
}
// start
forceRequest(url, whenSuccess, whenError); // call recursion function, with above callbacks
}
}
我不太明白?只需使用相同的参数在if语句中再次调用方法(getApiGoogleDesktop)。我尝试了这种方法
let data=JSON.parse(body);if(data.error){console.log(data.error);this.getApiGoogleDesktop(req,res)}
但是我得到了一个错误假设这个
绑定正确,这就是方法。你得到了什么错误?…\controllers\psiControllers.js:43 this.getApiGoogleDesktop(req,res)^TypeError:无法读取undefined的属性“getApiGoogleDesktop”,这意味着此
在该函数的作用域内未定义。您需要在调用它时通过将它绑定到类的实例来告诉它什么是此
。这意味着在内部递归调用该函数是tail-调用可优化的YAY数据结构类