【发布时间】:2021-01-23 13:11:58
【问题描述】:
我想在 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 中收到错误,因为“链接”不是 url,而是一个承诺。
【问题讨论】:
-
异步函数必须总是返回一个 Promise。
get_link()不返回任何东西(明确地)。它只执行search(),这是另一个异步函数。实际上,这并不完全正确。如果您未指定任何内容,它确实 会隐式返回最后一条语句。所以,它确实返回search()。但它会立即执行,而search()只是开始执行,因此search()被视为待处理的 Promise。由于这个原因,它永远不会解决。 -
你的 get_link 是错误的,把整个东西包装在 promise 构造函数中,而不仅仅是 setTimeout。
-
同样
song_length上的async是没有意义的,即使getInfo是异步的。 -
@JeremyThille 这里没有隐式返回,它会返回未定义的。或者更具体地说,一个返回 undefined.. 的 Promise :)
-
它将返回一个永远不会解决的未决承诺。它不是未定义的。异步函数总是返回一个 Promise。
标签: javascript asynchronous concurrency promise async-await