我正在尝试运行此函数,但是当我明确地硬编码返回值时,它会继续返回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}`
});
};
请帮助这是非常令人沮丧的。
答案 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
我希望它有所帮助。