【问题标题】:recursive Function returning promise递归函数返回承诺
【发布时间】:2019-05-25 21:56:53
【问题描述】:

我正在开发一个 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

【问题讨论】:

  • waitForTrack 目前不保证返回任何内容。 return 内部 setTimeout 不会影响外部代码
  • 在你的setTimeout你的回报不会返回任何东西

标签: javascript angular typescript promise es6-promise


【解决方案1】:

问题在于 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);
        });
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-09
    • 2018-10-11
    • 2020-01-24
    • 2023-03-28
    • 1970-01-01
    • 2018-12-01
    • 2016-05-07
    • 2017-04-02
    相关资源
    最近更新 更多