方法不等待提取完成

时间:2019-07-18 22:06:41

标签: javascript node.js promise

我正在使用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

2 个答案:

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