【问题标题】: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。

标签: javascript asynchronous concurrency promise async-await


【解决方案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.
猜你喜欢
  • 2019-01-31
  • 2023-03-21
  • 2018-01-17
  • 1970-01-01
  • 2023-04-08
  • 2023-03-05
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多