Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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
Node.js 我可以使用此方案安全地包装函数吗?_Node.js - Fatal编程技术网

Node.js 我可以使用此方案安全地包装函数吗?

Node.js 我可以使用此方案安全地包装函数吗?,node.js,Node.js,我想包装几个fs函数,这样每个函数都会在出错时重试,直到成功 我的目的是包装这些函数,同时保持其余代码完全不变 以下是我的计划: 首先,我实现了以下名为fix.js的文件: 然后,在我的代码中,在fs=requirefs之后,我立即调用require./fixfs 这个方案是否更安全,或者我是否应该担心任何未定义的行为 例如,我假设fix.js文件中的_fs对象在require./fix语句执行后将继续存在,但我不确定这个假设是否正确。快速回答是肯定的,是安全的 长答案是肯定的,是安全的,但是。

我想包装几个fs函数,这样每个函数都会在出错时重试,直到成功

我的目的是包装这些函数,同时保持其余代码完全不变

以下是我的计划:

首先,我实现了以下名为fix.js的文件:

然后,在我的代码中,在fs=requirefs之后,我立即调用require./fixfs

这个方案是否更安全,或者我是否应该担心任何未定义的行为


例如,我假设fix.js文件中的_fs对象在require./fix语句执行后将继续存在,但我不确定这个假设是否正确。

快速回答是肯定的,是安全的

长答案是肯定的,是安全的,但是。。。。解释:

是安全的,因为它会像你期望的那样工作,不会损坏任何东西。在这里之前,一切都很好

如果您得到的错误在手动执行某些操作之前无法解决,则会出现问题。例如,权限错误。代码将永远循环,直到您手动解决此问题,也可能会阻塞CPU或磁盘I/O,并且如果不免费占用CPU,就不可能在重试之间添加小的延迟。这实际上就是同步函数的问题

如果您遇到了在其他帖子中提到的EBUSY问题,它将占用整个循环中的一个CPU和大量磁盘I/O操作,直到文件不忙为止,因此有可能会减慢其他进程对文件所做的操作。如果你只有一个核心,操作会慢很多。这不是最优的。如果情况复杂,则必须避免使用同步fs函数。现在最好使用fs非阻塞函数,并在下次检查之前等待一段时间。在这里,等待一个滴答声实际上是优化的一个变化。您可以尝试使用async和Wait来保持内联的感觉,不需要回调,但可以释放事件循环,而不占用额外的CPU和磁盘I/O


顺便说一下,这些都是额外的细节。通常,封装fs函数是安全的。

另一个进程是我希望不存在的进程。因此,在我的例子中没有性能问题,而不是我的脚本失败,它只会进行一些打印,直到它可以继续。非常感谢你!!!
const _fs = {};

module.exports = function(fs) {
    for (const funcName of ["readFileSync", "writeFileSync", "appendFileSync"]) {
        _fs[funcName] = fs[funcName];
        fs[funcName] = function(...args) {
            while (true) {
                try {
                    return _fs[funcName](...args);
                }
                catch (error) {
                    console.log(error.message);
                }
            }
        };
    }
};