Node.js 使用async和Wait与for循环实现长进程
我正在尝试编写一系列代码,使用ffmpeg从图像生成视频。我有以下代码块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
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'));