如何成功等待函数结束?
Posted
技术标签:
【中文标题】如何成功等待函数结束?【英文标题】:How to succesfully wait for a function to end? 【发布时间】: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。
【参考方案1】:
正如我在 cmets 中所说,异步函数必须始终返回一个 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)
);
)
【讨论】:
It does return the last statement implicitly if you don't specify any
不在这里它不会,。您可能会与 lambda 函数混淆 -> const x => x * x
这里 x*x 将被返回。
根据经验,是的,确实如此……试试吧。标记为async
的函数就是这样做的。我花了一段时间才发现。
在控制台试试这个,-> async function test() var b = 'something' ; console.log('test =',await test());
当然,因为在你的例子中只有同步的东西 :) 尝试异步的东西(这就是异步函数的用途),即使你没有明确返回任何东西,它也会返回一个 Promise .这就是我的 codepen 所证明的。
@Keith 引用 MDN : Async functions always return a promise.
以上是关于如何成功等待函数结束?的主要内容,如果未能解决你的问题,请参考以下文章