创建一个包含递归函数的promise

时间:2018-12-31 09:45:43

标签: typescript recursion promise es6-promise

我正在编写一个简单的递归函数,该函数正在调用返回承诺的函数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 :(得分:1)

您实际上不需要做任何特别的事情–

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个函数可以保证返回Promise。但是,如果您不相信我它仍然可以正常工作,那么这里有一些补充说明: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

答案 1 :(得分:1)

  

我的aaa函数必须在调用结束时返回Promise

...这就是您的第一个代码中没有发生的事情。但是带有doTheThing的版本也会出错,因为与return所在的行中没有driver(index)

要使其返回承诺,您可以坚持使用代码的第一个版本,但在两个位置添加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