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

Я пишу простую рекурсивную функцию, которая вызывает функцию driver, которая возвращает обещание.И моя aaa функция должна возвращать Promise в конце вызовов.

Так что этот код упрощает мою проблему:

Код:

function aaa(index) {
      driver(index)
      .then(index => {
            if (index < 100)
                  aaa(index);
            else
                  console.log('finito' + index);     
      })

}

function driver(index) {
      return new Promise(resolve => {
            resolve(index + 1);
      });
}

aaa(0);

Мое решение:

function aaa(index) {
      console.log(index);
      return Promise.resolve(index)
            .then((index) => {
                  driver(index)
                        .then( index => {
                              if (index < 100)
                                    return aaa(index);
                              else
                                    return Promise.resolve(index);
                        });
            });
}

function driver(index) {
      return new Promise(resolve => {
            resolve(index + 1);
      });
}

function doTheThing() {
  Promise.resolve(0).then(aaa)
  .then(()=>{
    alert('end');
  });
}

doTheThing();

Но у меня все еще есть предупреждение редактора в последней then функции aaa, которая:

Argument of type '(index: {}) => Promise<void> | Promise<{}>'
is not assignable to parameter of type '(value: {}) => void | PromiseLike<void>'.
  Type 'Promise<void> | Promise<{}>' is not assignable to type 'void | PromiseLike<void>'.
    Type 'Promise<{}>' is not assignable to type 'void | PromiseLike<void>'.

Ответы [ 2 ]

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

функция my aaa должна возвращать Promise в конце вызовов

... Это именно то, что не происходит в вашем первом коде.Но также версия с doTheThing сталкивается с ошибкой, поскольку в строке с driver(index) нет return.

Чтобы вернуть обещание, вы можете придерживаться первой версии своего кода, но добавить return в двух местах:

function aaa(index) {
    return driver(index).then(index => {
//  ^^^^^^ (1)
        if (index < 100) {
            return aaa(index);
//          ^^^^^^ (2)
        } else {
            console.log('finito' + index);     
        }
    })
}

function driver(index) {
    return new Promise(resolve => {
        resolve(index + 1);
    });
}

function doTheThing() {
    Promise.resolve(0).then(aaa).then(() => {
        console.log('end');
    });
}

doTheThing();

Обратите внимание, что в doTheThing это не на самом деле , необходимое для Promise.resolve(0).then(aaa).then.Вы можете просто сделать aaa(0).then.

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

Вам не нужно делать ничего особенного -

const aaa = async n =>
  n < 100
    ? driver (n) .then (aaa)
    : n

const driver = async n =>
  n + 1

aaa (0) .then
  ( res => console .log ("res", res)
  , err => console .error ("err", err)
  )
  // res 100

Выше функции async гарантированно возвращают Обещание.Но если вы не верите мне, что это все еще работает, вот некоторые дополнительные доказательства: D

const aaa = async n =>
{ if (n >= 100)
    return n
  else if (n % 10 === 0)
    return status (n) .then (driver) .then (aaa)
  else
    return driver (n) .then (aaa)
}

const driver = async n =>
  new Promise (r => setTimeout (r, 15, n + 1)) // simulate 15ms delay

const status = async n =>
{ console .log ("progress: %d%", n)
  return n
}

aaa (0) .then
  ( res => console .log ("res", res)
  , err => console .error ("err", err)
  )

Выход

progress: 0%
progress: 10%
progress: 20%
progress: 30%
progress: 40%
progress: 50%
progress: 60%
progress: 70%
progress: 80%
progress: 90%
res 100
...