Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.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
Javascript 如何在不全局修改fs(编写库时)的情况下实现promisfyAll(fs)?_Javascript_Bluebird - Fatal编程技术网

Javascript 如何在不全局修改fs(编写库时)的情况下实现promisfyAll(fs)?

Javascript 如何在不全局修改fs(编写库时)的情况下实现promisfyAll(fs)?,javascript,bluebird,Javascript,Bluebird,AFAICT,如果我正在编写一个库,并且我使用promisifyAll(fs),这将修改已就位的fs模块(而不是返回修改后的副本)。因此,如果有人导入我的库,这也会对他们产生修改fs的副作用 有没有办法避免这种情况?您可以为不想更改的全局文件使用包装器对象: var Promise = require('bluebird'); var fs = Promise.promisifyAll(function(orig) { var myFs = {}; for (var m in o

AFAICT,如果我正在编写一个库,并且我使用
promisifyAll(fs)
,这将修改已就位的
fs
模块(而不是返回修改后的副本)。因此,如果有人导入我的库,这也会对他们产生修改
fs
的副作用


有没有办法避免这种情况?

您可以为不想更改的全局文件使用包装器对象:

var Promise = require('bluebird');
var fs = Promise.promisifyAll(function(orig) {
    var myFs = {};
    for (var m in orig)
        myFs[m] = orig[m]; // .bind(orig); is probably unnecessary
    return myFs;
}(require('fs')));

修改后的对象只添加了新属性(“xxxAsync”方法)。以前的现有属性根本不会更改。它与以前存在的对象100%兼容。为什么你认为会有问题?我同意这不太可能造成问题,但我会更愿意选择一个给我一个新对象的替代方案,而不是向每个人都使用的内置模块添加方法。导入我的库不应该导致副作用,即使这些副作用可能是无害的。此外,如果另一个模块也加载bluebird并在我的库已经完成后调用
promisifyAll(fs)
,则会发生什么情况,这是未记录的。它是再次覆盖这些方法还是只保留它们?如果我们使用不同的蓝鸟版本,但promisifyAll行为略有不同,会怎么样?事情可能会出问题。仅供参考,根据我所做的测试,在已promisified的对象上调用
promisifyAll()
,并不会取代以前的promisified方法—它只会保留以前的方法。事实证明,每个promisified方法都有一个
\uuu isPromisified\uu:true
属性,Bluebird会查看该属性,以确定其对该方法的工作已经完成。您可以始终只promisified()碰巧使用的单个函数。(免责声明:未经测试。我假设node
fs
确实将所有方法公开为可枚举的,并且没有其他内容)创建原始
fs
对象的通用副本,然后调用
promisifyAll()不是更容易吗
在副本上?现在,您正在重新实现
promisifyAll()中的一些逻辑
已包含决定操作哪些方法的步骤on@jfriend00:是的,这可能是个更好的主意。我最初担心
fs
方法可能无法处理外部
对象,但这不太可能。编辑了我的答案。