我正在使用Node Ytdl来获取视频的元数据。我有一个“提供程序”功能,我想返回视频的元数据对象。
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;
}
但是,我的getMetaD
函数从不返回在if(format)
块中分配的对象。它将始终返回obj = {}
。我究竟做错了什么?为什么我的代码在返回结果之前不等待结果分配给obj
?
答案 0 :(得分:1)
您正在对回调使用await。它仅在诺言上起作用。您可以通过执行此操作来实现相同的目的。
#include <dirent.h>
#include <errno.h>
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
void create_dir(char* outputdir,char* str_outpath,char* value){
DIR* dir = opendir(outputdir);
FILE *f;
if (dir) {
/* Directory exists. */
closedir(dir);
} else if (ENOENT == errno) {
/* Directory does not exist. */
mkdir(outputdir, 0700);
closedir(dir);
printf("Successfully created the directory %s ", outputdir);
} else {
printf("Creation of the directory %s failed",outputdir);
/* opendir() failed for some other reason. */
}
f = fopen(str_outpath, "a");
fprintf(f,"%s",value);
fclose(f);
}
int main(){
char directory[] = "/users/me/documents/testdir";
char filepath[] = "testfile";
char data[] = "hello world";
create_dir(directory,filepath,data);
return 0;
}
答案 1 :(得分:1)
ytdl.getInfo
将返回一个承诺,如果您未传递回调
因此,您将按照以下方式重写代码(此处没有错误检查,但是您也没有在代码中进行任何操作)
const getMetaD = async (mediaID) => {
let obj = {};
const info = await ytdl.getInfo(mediaID, {});
const 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;
}