从函数返回承诺值

时间:2020-05-10 21:34:52

标签: javascript typescript discord.js

我正在尝试使此递归函数返回一个promise值,我不知道该怎么做,我尝试过以不同的方式编写它,但是它们最终都以search为{{ 1}}

undefined

2 个答案:

答案 0 :(得分:0)

search将始终是未定义的,因为该函数会在任何异步操作返回之前返回。您需要返回第一个Promise,然后在.then回调中执行任何进一步的异步操作:

public search(message: Message) {
  const filter = (msg: Message) => msg.author.id === message.author.id;
    // immediately return the first promise
  return message.channel.send('Enter search term').then(msg => {
    // then when we get a message out of the first promise return the second one
    return message.channel.awaitMessages(filter, { max: 1 }).then(collected => {
      // then return the desired value at the end
      if (collected.first()!.content === 'Test') this.search(message);
      msg.delete();
      collected.first()!.delete();
      return collected.first()!.content;
    });
  });
}

理想情况下,我们希望避免嵌套承诺摆脱被发明来销毁它们的深层回调地狱:

public search(message: Message) {
  const filter = (msg: Message) => msg.author.id === message.author.id;
  return message.channel.send('Enter search term')
    .then(msg => Promise.all([
      msg,
      message.channel.awaitMessages(filter, { max: 1 })
    ]))
    .then(([msg, collected]) => {
      if (collected.first()!.content === 'Test') this.search(message);
      msg.delete();
      collected.first()!.delete();
      return collected.first()!.content;
    });
}

通过使用Promise.all,我们可以避免必须嵌套承诺并仍然可以访问以前解析的值。

答案 1 :(得分:0)

您是否考虑过使用异步功能?仅此一点就可以使您的代码更易于调试和理解。

public async search(message: Message): Promise<any> {
    const filter = (msg: Message) => msg.author.id === message.author.id;
    const msg = await message.channel.send('Enter search term');
    const collected = await message.channel.awaitMessages(filter, { max: 1 });
    if (collected.first()!.content === 'Test') return this.search(message);
    msg.delete();
    collected.first()!.delete();
    const search = collected.first()!.content;
    return search;
}

在这里,search被定义为const并立即返回,这对于编译器是可以的。 我没有使用变量来保存嵌套this.search调用的返回值,但是如果您决定在计算实际结果后执行更多代码,则可能必须这样做。