如何在 Node JS 中同步 2 个异步函数?
How to syncronize 2 asyncronized functions in NodeJS?
我正在使用 npm 模块中名为 ytdl-core 的库和用于 NodeJS 的 ffmpeg
这些模块有 2 个功能,一个是下载视频,另一个是从 Youtube 视频中获取音频。这两个函数都是异步的,但在我的算法中,一个函数依赖于另一个函数。
首先,我要下载音频,然后我要获取音频源的视频,我不想异步执行,我想要同步操作
这是我的代码:
var stream = app.ytdl(req.body.linkYoutube,{quality: 18});
//First, download audio
app.ffmpeg(stream)
.audioBitrate(128)
.save(`${__dirname}/music.mp3`)
.on('progress', (p) => {
app.readline.cursorTo(process.stdout, 0);
process.stdout.write(`${p.targetSize}kb downloaded`);
})
.on('end', () => {
res.status(200).download('./controllers/music.mp3');
});
//Second, download video of that audio
app.ytdl(req.body.linkYoutube, { filter : (format) =>
format.container === 'mp4' &&
format.qualityLabel ==='720p'// &&
// format.itag === 18
})
.pipe(app.fs.createWriteStream('video.mp4'));
我知道这不好,但这是学习异步的好练习,谢谢!
您可以使用 Promise
在第一个函数完成后立即执行第二个函数,如下所示:
new Promise(resolve => {
app.ffmpeg(stream)
.audioBitrate(128)
.save(`${__dirname}/music.mp3`)
.on('progress', (p) => {
app.readline.cursorTo(process.stdout, 0);
process.stdout.write(`${p.targetSize}kb downloaded`);
})
.on('end', () => {
res.status(200).download('./controllers/music.mp3');
resolve();
});
}).then(() => {
//Second, download video of that audio
app.ytdl(req.body.linkYoutube, {
filter: (format) =>
format.container === 'mp4' &&
format.qualityLabel === '720p'// &&
// format.itag === 18
})
.pipe(app.fs.createWriteStream('video.mp4'));
}
})
我正在使用 npm 模块中名为 ytdl-core 的库和用于 NodeJS 的 ffmpeg 这些模块有 2 个功能,一个是下载视频,另一个是从 Youtube 视频中获取音频。这两个函数都是异步的,但在我的算法中,一个函数依赖于另一个函数。 首先,我要下载音频,然后我要获取音频源的视频,我不想异步执行,我想要同步操作
这是我的代码:
var stream = app.ytdl(req.body.linkYoutube,{quality: 18});
//First, download audio
app.ffmpeg(stream)
.audioBitrate(128)
.save(`${__dirname}/music.mp3`)
.on('progress', (p) => {
app.readline.cursorTo(process.stdout, 0);
process.stdout.write(`${p.targetSize}kb downloaded`);
})
.on('end', () => {
res.status(200).download('./controllers/music.mp3');
});
//Second, download video of that audio
app.ytdl(req.body.linkYoutube, { filter : (format) =>
format.container === 'mp4' &&
format.qualityLabel ==='720p'// &&
// format.itag === 18
})
.pipe(app.fs.createWriteStream('video.mp4'));
我知道这不好,但这是学习异步的好练习,谢谢!
您可以使用 Promise
在第一个函数完成后立即执行第二个函数,如下所示:
new Promise(resolve => {
app.ffmpeg(stream)
.audioBitrate(128)
.save(`${__dirname}/music.mp3`)
.on('progress', (p) => {
app.readline.cursorTo(process.stdout, 0);
process.stdout.write(`${p.targetSize}kb downloaded`);
})
.on('end', () => {
res.status(200).download('./controllers/music.mp3');
resolve();
});
}).then(() => {
//Second, download video of that audio
app.ytdl(req.body.linkYoutube, {
filter: (format) =>
format.container === 'mp4' &&
format.qualityLabel === '720p'// &&
// format.itag === 18
})
.pipe(app.fs.createWriteStream('video.mp4'));
}
})