如何成功等待函数结束?

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.

以上是关于如何成功等待函数结束?的主要内容,如果未能解决你的问题,请参考以下文章

linux线程的创建、退出、等待、取消、分离

Javascript:在循环继续之前等待函数结束[重复]

等待递归 readdir 函数结束

C语言中输入函数等待输入和结束输入

Thread的线程相关函数

MFC中如何建立和结束一个线程