我正在尝试使此递归函数返回一个promise值,我不知道该怎么做,我尝试过以不同的方式编写它,但是它们最终都以search
为{{ 1}}
undefined
答案 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
调用的返回值,但是如果您决定在计算实际结果后执行更多代码,则可能必须这样做。