【发布时间】:2019-06-17 09:14:36
【问题描述】:
我正在构建一个 Discord 音乐机器人,我需要使用此功能生成一个对象。问题是函数返回得太早并且对象没有完全构建。函数中的循环只有在函数退出后才结束。
函数fetchVideoInfo() 执行在.then() 函数中传递的回调,它返回的promise,如图所示。但是我无法编辑它,因为它是模块的一部分。我认为这是一个问题,即使我在等待fetchVideoInfo() 完成,它仍然会继续,因为它是如何编写的,在内部承诺之后执行回调。我将提供返回实际承诺并调用回调函数的部分代码。我尝试过让我的函数返回承诺,但它不适用于我认为相同的问题,函数在回调之前结束,我必须等待。我也尝试过将回调函数包装在另一个函数中然后传递它,同时等待初始函数,但它也做得不好。
https://imgur.com/HdFF8VJ 这是指向该模块中返回值图像的链接(“youtube-info”)。整个模块其实就是fetchVideoInfo()函数
async function generatePlayList(queue) {
const date = new Date();
let embed = new Discord.RichEmbed();
embed
.setTitle("Playlist")
.setColor("#25473A")
.setDescription("Music currently in playlist!")
.setFooter("Time ")
.setTimestamp(date);
for await (let id of queue)
fetchVideoInfo(id, (Null, info) => {
const { duration, title, url } = info;
const seconds = duration % 60;
const minutes = Math.trunc(duration / 60);
embed.addField(`[${title}](${url})`, `Duration ${minutes}:${seconds}`);
console.log(embed.fields);
});
console.log(embed.fields);
return embed;
}
现在发生的情况是该函数首先返回导致 embed 对象未修改,即使它之前有 for -await - of 循环(这是新的 ES2018 语法)。它应该先完成for-of循环然后返回
【问题讨论】:
-
await 只对promise 生效,即使函数是async 如果等待的方法不是promise 也不会产生wait 效果。简而言之,您必须将填充对象的方法转换为promise。
-
你能举个例子吗?我尝试了多种方式,但没有达到我的预期
标签: javascript node.js async-await