Javascript 方法不等待获取完成

Javascript 方法不等待获取完成,javascript,node.js,promise,Javascript,Node.js,Promise,我正在使用以获取视频的元数据。我有一个“提供者”函数,我想返回视频的元数据对象 const getMetaD = async (mediaID) => { let obj = {}; await ytdl.getInfo(mediaID, {}, async (err, info) => { if (err) console.log(err); let format = await ytdl.chooseFormat(info.format

我正在使用以获取视频的元数据。我有一个“提供者”函数,我想返回视频的元数据对象

const getMetaD = async (mediaID) => {
   let obj = {};

   await ytdl.getInfo(mediaID, {}, async (err, info) => {
       if (err) console.log(err);

       let format = await ytdl.chooseFormat(info.formats, { quality: 'highest' });

       if (format) {
         console.log('Format found!', format);
         obj = { url: format.url, thumbnail: info.thumbnail, title: info.title };
       }
     });

  return obj;
}

但是,my
getMetaD
函数从不返回在
if(format)
块中指定的对象。它将始终返回
obj={}
。我做错了什么?为什么我的代码在返回结果之前不等待将结果分配给
obj

您在回调中使用的是wait。它只适用于承诺。但是,通过这样做,您可以实现同样的目标

const getMetaD = (mediaID) => {
    return new Promise((resolve, reject) => {
           let obj = {};

       ytdl.getInfo(mediaID, {}, async (err, info) => {
           if (err) console.log(err);

           let format = await ytdl.chooseFormat(info.formats, { quality: 'highest' });

           if (format) {
             console.log('Format found!', format);
             obj = { url: format.url, thumbnail: info.thumbnail, title: info.title };
           }
           resolve(obj);
         });
    })

}

您正在回调时使用wait。它只适用于承诺。但是,通过这样做,您可以实现同样的目标

const getMetaD = (mediaID) => {
    return new Promise((resolve, reject) => {
           let obj = {};

       ytdl.getInfo(mediaID, {}, async (err, info) => {
           if (err) console.log(err);

           let format = await ytdl.chooseFormat(info.formats, { quality: 'highest' });

           if (format) {
             console.log('Format found!', format);
             obj = { url: format.url, thumbnail: info.thumbnail, title: info.title };
           }
           resolve(obj);
         });
    })

}

如果您不传入回调,
ytdl.getInfo
将返回一个承诺

因此,您可以按如下方式重写代码(此处没有错误检查,但也不会在代码中执行任何操作)


如果您不传入回调,
ytdl.getInfo
将返回一个承诺

因此,您可以按如下方式重写代码(此处没有错误检查,但也不会在代码中执行任何操作)


你可能在等待,而不是承诺。
ytld.getInfo
是否真的接受回调并返回对
wait
的承诺?您可能是
wait
而不是承诺。
ytld.getInfo
是否真的接受回调,并向
wait
返回承诺?这应该是公认的答案。公平地说,shows
getInfo()
总是返回一个承诺,但正如您所看到的,只有在没有定义回调的情况下才会返回,这应该是可以接受的答案。公平地说,shows
getInfo()
总是返回承诺,但正如您所看到的,只有在未定义回调的情况下才会返回承诺