异步Javascript函数返回undefined

时间:2018-04-12 16:57:03

标签: javascript node.js ffmpeg async-await

我正在尝试运行此函数,但是当我明确地硬编码返回值时,它会继续返回undefined。

const splitVideo = async (sid, video, part) => {
    let framesLocation =`${process.cwd()}/${dirs.videoFrames}/${sid}_${part}`;

    console.log(fs.existsSync(framesLocation));

    if(!fs.existsSync(framesLocation)) {
        console.log("making dir");
        f.s.mkdirSync(framesLocation);
    }

    ffmpeg(video)
        .on('end', () => {
             return "done";
         })
         .on('error', (err) => {
             throw err;
         })
         .screenshots({
              timestamps: [1,2],
              filename: `${sid}_${part}/frame-%s.png`,
              folder: `${process.cwd()}/${dirs.videoFrames}`
         });
};

请帮助这是非常令人沮丧的。

3 个答案:

答案 0 :(得分:4)

您的功能不会返回任何内容,这就是您获得undefined的原因。在ffmpeg中换取new Promise(...)来电,以便能resolve其异步结果:

const splitVideo = async (sid, video, part) => {
    // ...

    return new Promise((resolve, reject) => {
        ffmpeg(video)
            .on('end', () => {
                resolve("done");
             })
            .on('error', (err) => {
                reject(err);
             })
             .screenshots({
                  timestamps: [1,2],
                  filename: `${sid}_${part}/frame-%s.png`,
                  folder: `${process.cwd()}/${dirs.videoFrames}`
             });
    };
};

const ret = await splitVideo(...);
console.log(ret);

另请注意,您需要await此函数才能读取结果(或在then处理程序中获取结果)。

答案 1 :(得分:0)

您只能await承诺。

const splitVideo = async (sid, video, part) => {
// ...

const val = await new Promise((resolve, reject) => {
    ffmpeg(video)
        .on('end', () => {
            resolve("done");
         })
        .on('error', (err) => {
            reject(err);
         })
         .screenshots({
              timestamps: [1,2],
              filename: `${sid}_${part}/frame-%s.png`,
              folder: `${process.cwd()}/${dirs.videoFrames}`
         });
      //... more code using the val maybe?
      return val
  };
};

答案 2 :(得分:0)

问题是您的splitVideo异步功能中的ffmpeg(视频)功能是异步的。发生的事情是你的splitVideo函数被调用但它在你的ffmpeg(视频)函数完成之前返回undefined。你能做些什么来解决这个问题?

您已将splitVideo功能定义为异步功能,这允许您使用保留字" await"。但首先让我们将你的ffmpeg(视频)功能封装在一个承诺中。

const splitVideo = async (sid, video, part) => {
    //Your code
    let promise = new Promise((resolve, reject) => {
         ffmpeg(video)
            .on('end', () => {
                  resolve("done");
             })
             .on('error', (err) => {
                 reject(err);
             })
             .screenshots({
                   timestamps: [1,2],
                   filename: `${sid}_${part}/frame-%s.png`,
                   folder: `${process.cwd()}/${dirs.videoFrames}`
             });
       });
try{
    return await promise;
 }catch(err){
    return err;        
}

这对于您的splitVideo功能来说应该足够了,但是需要注意的是导致未处理的Promises拒绝被弃用,并且将来会终止你的node.js进程。你需要做的是为你的splitVideoFunction添加一个.catch()语句,如:

  

splitVideo.catch((err)=> {//您的代码})。然后((结果)=> {//您的代码})

或者你可以在另一个异步函数中调用splitVideo并使用:

try {
    await splitVideo(video);
}catch(err){
    //Your code
}

如果你对async / await有任何疑问,我可能会发现这个问题很有用。 Node.JS - Can`t get async throws with try/catch blocks

我希望它有所帮助。