gpt4 book ai didi

javascript - Node 最佳实践 : Throwing async error in constructor

转载 作者:行者123 更新时间:2023-11-29 22:04:14 24 4
gpt4 key购买 nike

我正在使用 Node,我有一个将目录作为参数的“类”。它会尝试创建该目录,如果失败,则会抛出错误:

function Config(dir) {
fs.mkdir(dir, function(err) {
if(err) throw new Error('Error', err);
}
}

我的问题是,这是经过批准的做法吗?如果我要使用回调,那么我的程序的其余部分将不得不驻留在该回调中,这对我来说似乎很奇怪。

当我尝试使用 mocha 编写测试时,由于在异步调用中抛出异常,该测试无法正常工作,这个问题就出现了:

it('should throw an error on a bad directory', function() {
var fn = function() {
var badConfig = new Config('/asdf');
};
assert.throws(fn, Error);
});

我调查了域作为解决单元测试问题的方法,但这似乎并没有解决我的问题(或者我没有正确实现它们)。

var d = domain.create().on('error', function(err) { throw err; }
d.run(function() {
function Config(dir) {
fs.mkdir(dir, function(err) {
if(err) throw err;
}
}
});

最终,我正在寻找一种最佳实践,它允许我向应用程序指示发生了一些不好的事情,并允许我为该解决方案创建测试。

最佳答案

你有三种可能:

  1. 使用同步调用。正如 AsolBerg 所解释的那样,您的案例完全符合为什么某些 fs 函数具有同步等价物的原因。没关系,因为在您的情况下,您的所有应用程序都依赖于一个要加载的 Config 实例。但也有情况

  2. 使用回调作为构造函数参数。

  3. 如果构造函数回调对您来说真的太奇怪了,请将您的初始化代码放入一个接受回调的 init() 方法中。这是个人喜好的问题,而是使用这种技术。

最后一个选项,您可以在 init() 方法中返回一个 Future。 NodeJS 中有几个 future 的库,它们是回调参数的优雅替代品。但是您不能在构造函数中使用它...因为构造函数的返回是创建的对象。

关于javascript - Node 最佳实践 : Throwing async error in constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21834956/

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