Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如果出现错误,如何再次执行该方法_Node.js_Typescript - Fatal编程技术网

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数据结构类