Рекурсивная функция, возвращающая обещание - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю над проектом 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

1 Ответ

0 голосов
/ 28 декабря 2018

Проблема заключалась в том, что setTimeout никогда не возвращает никакого результата из его тела, поэтому решение будет использовать Promise, потому что reject () или resol () могут быть выполнены в теле 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);
        });
  }
...