我想在youtube中获得一首歌曲的长度,但是我无法让程序等待我的get_link
函数结束,即使我使用async / await,我的代码也将始终返回[Object,Promise ]
async function get_link (song) {
search(song, opts, function(err, results) {
if(err) return console.log(err);
return new Promise(getlink => {
setTimeout(() => {
getlink(results[0].link);
}, 7000);
})
});
}
async function song_length (song) {
return ytdl.getInfo(song);
}
async function main () {
let link = await get_link("misery");
console.log("Link: " + link);
let len = await song_length(link);
console.log("Len: " + len);
}
我在song_length中遇到错误,因为“链接”不是网址,而是承诺。
答案 0 :(得分:1)
正如我在评论中所说,异步函数必须始终返回Promise。 get_link()
不返回任何信息(明确地)。它仅执行search()
,这是另一个异步功能。
实际上,这不太正确。如果您未明确指定任何异步函数,则该函数会隐式返回最后一条语句。因此,它确实返回search()
。但是它会立即执行此操作,而search()
才刚刚开始执行,因此search()
作为待决的Promise会返回,它将永远无法解决。
async function get_link(song) {
return new Promise((resolve, reject) => {
search(song, opts, function(err, results) {
if (err) {
reject(err);
} else {
resolve(results)
}
});
})
}