gpt4 book ai didi

node.js - 杀死一个 Unresolved promise (或忽略并继续前进)

转载 作者:行者123 更新时间:2023-12-04 23:08:30 24 4
gpt4 key购买 nike

使用 Node 子进程exec ,我通过一个需要一些时间的 promise 来调用 ffmpeg 转换。每次用户单击“下一步”时,它都会在新文件上启动 FFMpeg 命令:

function doFFMpeg(path){
return new Promise((resolve, reject) => {
exec('ffmpeg (long running command)', (error, stdout, stderr) => {
if (error) {
reject();
}
}).on('exit', (code) => { // Exit returns code 0 for good 1 bad
if (code) {
reject();
} else {
resolve();
}
});
});
}

问题是,如果用户在返回 promise 之前转到下一个视频,我需要放弃该过程并继续转换下一个视频。

我该怎么做:

A)(理想情况下)取消当前 promise 的执行过程*
B)让当前 promise 的执行过程完成,但在我开始新的 promise 时忽略该 promise 。

*我意识到 promise.cancel is not yet in ECMA ,但我想知道一种解决方法——最好不使用第 3 方模块/库。

尝试:
let myChildProcess;

function doFFMpeg(path){

myChildProcess.kill();

return new Promise((resolve, reject) => {
myChildProcess = exec('ffmpeg (long running command)', (error, stdout, stderr) => {
if (error) {
reject();
}
}).on('exit', (code) => { // Exit returns code 0 for good 1 bad
if (code) {
reject();
} else {
resolve();
}
});
});
}

最佳答案

假设 exec()确实返回了一个带有 .kill() 的对象方法,尝试看起来非常接近你想要的。你只需要接受 Promise 拒绝来代替取消,这在原生 Promises 中是不可用的。拒绝比取消通常是无关紧要的,甚至更好。

据我了解,终止进程将导致回调触发错误,(和/或“退出”处理程序触发错误代码)。如果是这样,您不需要在进程被终止时明确拒绝 promise - reject()无论如何都会被调用。

您的 doFFMpeg()只是需要在调用 myChildProcess.kill() 时注意安全.

这样的事情应该这样做:

const doFFMpeg = (function() {
var myChildProcess = null;
return function (path) {
if (myChildProcess) {
myChildProcess.kill();
}
return new Promise((resolve, reject) => {
myChildProcess = exec('ffmpeg (long running command)', (error, stdout, stderr) => {
if (error) {
reject(error);
}
myChildProcess = null;
});
myChildProcess.on('exit', (code) => { // Exit returns code 0 for good 1 bad
if (code) {
reject(new Error('bad exit'));
} else {
resolve();
}
myChildProcess = null;
});
});
}
})();

我不确定 exec()的回调是必要的(除非您需要处理 stdout/ stderr 或需要了解 error 的详细信息)。可能只有 .on('exit')处理程序就足够了,或者可能 .on('end').on('error')处理程序。

如果调用者需要以不同于其他错误的方式处理“终止错误”,那么还有一些工作要做。您需要确保在 kill 时,Promise 会因可检测到的错误而被拒绝(例如自定义错误,或带有自定义属性的错误猴子补丁)。

关于node.js - 杀死一个 Unresolved promise (或忽略并继续前进),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46230631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com