Node.js 使用async和Wait与for循环实现长进程

Node.js 使用async和Wait与for循环实现长进程,node.js,Node.js,我正在尝试编写一系列代码,使用ffmpeg从图像生成视频。我有以下代码块 const execFile = require('child_process').execFile; const userProject = { //some process data } async function test() { for (let i = 0; i < userProject.projectImages.length; i++) { console.lo

我正在尝试编写一系列代码,使用ffmpeg从图像生成视频。我有以下代码块

const execFile = require('child_process').execFile;

const userProject = {
    //some process data
}


async function test() {
    for (let i = 0; i < userProject.projectImages.length; i++) {
        console.log('Before await for ', i);

       //code block 1...
        let outFile = 'userGeneratedVideo/video-' + i + '.mkv';

        //code block 2
            }
            console.log('Success: Video rendering completed for: ' + outFile);

        });

        let result = await Promise.resolve(i);
        console.log('Video creation started After await. Value is ', result);
    }
}
test().then(_ => console.log('After test() resolved'));

我无法弄清楚的是,如何确保“after test()resolved”仅在所有成功后执行:视频渲染完成。

在for循环之后,或者您可以使用检查来执行此操作

if(i === userProject.projectImages.length -1 )

你应该检查你的代码,因为当你使用
let result=wait Promise.resolve(i)
你真的不需要等待任何东西,
Promise.resolve()
是即时的,你的
wait
语法的真正过程在你渲染视频之前。

你在等待
i
这是一个已经解决的数字(不是承诺),我认为您在
execFile
方面有问题,这不是承诺,您可以这样做:

假设您正在使用
子进程.execFile

尝试:


现在还不清楚你真正的代码是什么样子的。您发布的代码存在语法和缩进问题,可能是因为您删除了相关部分。承诺被错误地链接,所以您有错误的控制流。实际上,在这两者之间没有承诺。它只是execFile的一个大代码块,不返回任何承诺。我的问题是test.then语句应该最后执行,但它是在成功之前执行的:rendering completed console.log。请更新被剪掉的代码,这不清楚,我想您在每个循环中调用的是:
renderVideo
而不等待,或者可能,
renderVideo
不返回承诺。您没有提供SO规则要求的承诺。问题是execFile,您故意将其从问题中删除。您发布的代码不包含异步代码,将按预期工作。事实上,两者之间没有承诺——这就是为什么它表现得像它表现出来的那样。没什么可等待的。你应该试试
ffmpeg-concat
Hi,谢谢你的回复,但你能再详细一点吗?
if(i === userProject.projectImages.length -1 )
const execFile = require('child_process').execFile;

const userProject = {
    //some process data
}


function test() {
    return Promise.mapSeries(userProject.projectImages, (image, i) =>
        console.log('Before await for ', i);

        let outFile = 'userGeneratedVideo/video-' + i + '.mkv';

        // Supposed call
        return new Promise((resolve, reject) => {
            execFile(`ffmpeg -i ${image} -o ${outFile}`, (err, result) => {
                if(err) {
                    return reject(err);
                }

                return resolve(result);
            });
            console.log('Video creation started');
        });

    }
}
test().then(_ => console.log('After test() resolved'));