异步Javascript函数返回未定义的
我试图运行这个函数,但是当我显式地硬编码返回值时,它一直返回未定义的值异步Javascript函数返回未定义的,javascript,node.js,ffmpeg,async-await,Javascript,Node.js,Ffmpeg,Async Await,我试图运行这个函数,但是当我显式地硬编码返回值时,它一直返回未定义的值 const splitVideo = async (sid, video, part) => { let framesLocation =`${process.cwd()}/${dirs.videoFrames}/${sid}_${part}`; console.log(fs.existsSync(framesLocation)); if(!fs.existsSync(framesLocat
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}`
});
};
请帮助,这非常令人沮丧。您的函数没有返回任何内容,这就是为什么您得到了未定义的
。包装ffmpeg
调用newpromise(…)
以能够解析其异步结果:
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);
还请注意,您需要等待此函数才能读取结果(或在然后在处理程序中获取结果)。您的函数不会返回任何内容,这就是为什么您得到未定义的。包装ffmpeg
调用newpromise(…)
以能够解析其异步结果:
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);
另请注意,您需要wait
此函数才能读取结果(或在然后处理程序中获取结果)。您只能wait
函数
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
};
};
你只能等待承诺
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
};
};
问题是splitVideo异步函数中的ffmpeg(视频)函数是异步的。发生的情况是,正在调用splitVideo函数,但它在ffmpeg(视频)函数完成之前返回未定义。你能做些什么来解决这个问题
您已经将splitVideo函数定义为异步函数,这允许您使用保留字“wait”。但首先,让我们将ffmpeg(视频)函数封装在promise中
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函数来说,这应该足够了,但重要的是要注意,因为未处理的承诺拒绝将被弃用,并且将来将终止node.js进程。您还需要向splitVideoFunction添加一个.catch()语句,类似于:
splitVideo.catch((err)=>{//your code})。然后((result)=>{//your code})
或者,您可以在另一个异步函数中调用splitVideo并使用:
try {
await splitVideo(video);
}catch(err){
//Your code
}
如果您像我一样对async/Wait有任何疑问,您可能会发现这个问题很有用。
我希望它能有所帮助。问题在于splitVideo异步函数中的ffmpeg(视频)函数是异步的。发生的情况是,正在调用splitVideo函数,但它在ffmpeg(视频)函数完成之前返回未定义。你能做些什么来解决这个问题
您已经将splitVideo函数定义为异步函数,这允许您使用保留字“wait”。但首先,让我们将ffmpeg(视频)函数封装在promise中
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函数来说,这应该足够了,但重要的是要注意,因为未处理的承诺拒绝将被弃用,并且将来将终止node.js进程。您还需要向splitVideoFunction添加一个.catch()语句,类似于:
splitVideo.catch((err)=>{//your code})。然后((result)=>{//your code})
或者,您可以在另一个异步函数中调用splitVideo并使用:
try {
await splitVideo(video);
}catch(err){
//Your code
}
如果您像我一样对async/Wait有任何疑问,您可能会发现这个问题很有用。
我希望它能有所帮助。可能是你想要它返还什么的副本?你可以让它返还一个承诺。您想在这里实现什么?它是一个由顶部的“async”关键字指定的异步函数。我在另一个文件中“等待”它。如果我把return语句移到函数的开头,它可以正常工作,但是当我把它移到现在的位置时,它返回未定义的语句@阿披舍克你想要它归还什么?你可以让它归还一个承诺。您想在这里实现什么?它是一个由顶部的“async”关键字指定的异步函数。我在另一个文件中“等待”它。如果我把return语句移到函数的开头,它可以正常工作,但是当我把它移到现在的位置时,它返回未定义的语句@AbhishekGuptaCorrect,只是添加了一些解释正确,只是添加了一些解释