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
相关产品推荐
相关产品推荐

