You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Async JavaScript函数硬编码返回值仍返回undefined问题

解决异步函数返回undefined的问题

嘿,我一眼就看出问题出在哪了!你的这个splitVideo函数之所以一直返回undefined,核心原因是你把返回语句写在了ffmpeg的end回调函数里,而不是在splitVideo这个async函数本身的逻辑里。

async函数的本质是自动把返回值包装成Promise,但如果函数体内没有直接返回一个值(或者Promise),它就会默认返回一个resolve为undefined的Promise。你现在写的return "done"是在end这个回调里执行的,和外层的splitVideo函数完全没关系,所以外层函数自然拿不到这个返回值。

正确的写法:把ffmpeg操作包装成Promise

我们只需要把ffmpeg的异步逻辑包裹在一个Promise里,让splitVideo直接返回这个Promise,就能拿到预期的结果了:

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"); 
    // 修正笔误,加上recursive避免父目录不存在报错
    fs.mkdirSync(framesLocation, { recursive: true }); 
  } 

  // 用Promise包裹ffmpeg的异步操作
  return new Promise((resolve, reject) => {
    ffmpeg(video) 
      .on('end', () => { 
        // 用resolve传递结果,替代原有的return
        resolve("done"); 
      }) 
      .on('error', (err) => { 
        // 用reject传递错误
        reject(err); 
      }) 
      .screenshots({ 
        // 补全你的截图参数,示例如下
        timestamps: ['00:00:01', '00:00:05'], // 要截取的时间点
        filename: `${sid}_${part}_%i.png`, // 截图文件名格式
        folder: framesLocation // 截图保存目录
      });
  });
};

调用函数的正确姿势

之后调用这个函数的时候,记得用await或者.then()来获取结果:

// 示例调用
async function runSplit() {
  try {
    const result = await splitVideo('video_001', './source.mp4', 'part1');
    console.log(result); // 这里会输出"done"
  } catch (error) {
    console.error('视频分割失败:', error);
  }
}

runSplit();

额外注意点

  • 原代码里的f.s.mkdirSync应该是笔误,改成fs.mkdirSync更合理;加上{ recursive: true }可以自动创建不存在的父目录,避免抛出异常。
  • 如果你的ffmpeg库本身支持Promise(有些封装版本支持),也可以直接用它的Promise API,不用自己手动包裹,写法会更简洁。

内容的提问来源于stack exchange,提问作者Leon Wright

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:02:28