首页 > 解决方案 > 递归函数返回承诺

问题描述

我正在开发一个 Ionic 3 项目,这意味着我正在使用 Angular 5、ES6、TypeScript。

我正在尝试编写一个返回承诺的递归函数,但出现执行错误:

实际上,我正在尝试执行一个函数,该函数等到条件得到验证或超时 5 秒,类似的事情等到 (myCondition | timeout) 然后返回已解决或被拒绝的承诺。

该函数每 100 毫秒测试一次,如果条件验证它返回一个已解决的承诺,否则它会进行递归调用,直到第 50 次调用,因此它返回一个被拒绝的承诺:

代码:

  waitForTrack(flag,callNumber){
    if(callNumber < 50){
      if (this._audioProvider.tracks.length == flag)
        setTimeout(()=>{ 
          return this.waitForTrack(flag,callNumber++)},100)
      else
        return new Promise((resolve,reject) =>{ 
          resolve();
        });
    }else{
      return new Promise((resolve,reject) =>{ 
        reject();
      });
    }
  }

错误:

core.js:1449 ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'then' of undefined
TypeError: Cannot read property 'then' of undefined

标签: javascriptangulartypescriptpromisees6-promise

解决方案


问题是 setTimeout 永远不会从其主体返回任何结果,因此解决方案将使用 Promise,因为 reject() 或 resolve() 可以在 setTimeout 的主体中执行:

  waitForTrack(flag,callNumber){
        return new Promise((resolve,reject) =>{ 
          if (this._audioProvider.tracks.length == flag){
            resolve();
          }else if (callNumber > 49)
              reject();
            else
              setTimeout(()=>this.waitForTrack(flag,callNumber++),100);
        });
  }

推荐阅读