Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异步Javascript函数返回未定义的_Javascript_Node.js_Ffmpeg_Async Await - Fatal编程技术网

异步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,只是添加了一些解释正确,只是添加了一些解释