如何成功等待功能结束?

时间:2020-10-08 13:15:58

标签: javascript asynchronous concurrency promise async-await

我想在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中遇到错误,因为“链接”不是网址,而是承诺。

1 个答案:

答案 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)
            }
        });
    })
}