JavaScript让构造函数返回Promise是不好的做法吗?
我正在尝试为博客平台创建一个构造函数,并且其中包含许多异步操作。这些范围包括从目录中获取帖子,对其进行解析,通过模板引擎发送它们,等等。
所以我的问题是,让我的构造函数返回一个promise而不是调用它们的函数的对象是不明智的new
。
例如:
var engine = new Engine({path: '/path/to/posts'}).then(function (eng) { // allow user to interact with the newly created engine object inside 'then'
engine.showPostsOnOnePage();
});
现在,用户可能 提供补充的Promise链接:
var engine = new Engine({path: '/path/to/posts'});// ERROR
// engine will not be available as an Engine object here
这可能会带来问题,因为用户可能会感到困惑,为什么engine
在构造后仍然无法使用。
在构造函数中使用Promise的原因很有意义。我希望整个博客在构建阶段之后都能正常运行。但是,调用后立即无法访问该对象似乎有点难闻new
。
我一直在争论使用类似engine.start().then()
或engine.init()
将返回Promise的方式。但是那些看起来也很臭。
编辑:这在Node.js项目中。
回答:
是的,这是一个坏习惯。构造函数应该返回其类的实例,而没有别的。否则会弄乱new
运算符和继承。
此外,构造函数应仅创建和初始化新实例。它应该设置数据结构和所有特定于实例的属性,但
任何任务。如果可能的话,它应该是一个没有副作用的纯函数,具有所有优点。
如果我想从构造函数中执行操作怎么办?
那应该放在您的类的方法中。您想改变全局状态?然后显式调用该过程,而不是作为生成对象的副作用。该调用可以在实例化之后立即进行:
var engine = new Engine()engine.displayPosts();
如果该任务是异步的,那么您现在可以轻松地从方法中返回其结果的承诺,轻松地等待直到完成为止。
但是,当方法(异步)使实例发生突变并且其他方法依赖于该实例时,我不建议使用此模式,因为这将导致它们需要等待(即使它们实际上是同步的,也要成为异步的),并且您很快就会拥有一些内部队列管理正在进行。不要编写实例存在但实际上不可用的代码。
如果要异步将数据加载到实例中怎么办?
问问自己: 您实际上是否需要没有数据的实例? 你能以某种方式使用它吗?
如果答案是没有,那么你不应该你有数据之前创建它。将数据本身作为构造函数的参数,而不是告诉构造函数如何获取数据(或传递对数据的承诺)。
然后,使用静态方法加载数据,并从中返回承诺。然后链接一个将数据包装在新实例上的调用:
Engine.load({path: '/path/to/posts'}).then(function(posts) { new Engine(posts).displayPosts();
});
这在获取数据的方式上提供了更大的灵活性,并大大简化了构造函数。同样,您可以编写静态工厂函数来返回Engine
实例的Promise:
Engine.fromPosts = function(options) { return ajax(options.path).then(Engine.parsePosts).then(function(posts) {
return new Engine(posts, options);
});
};
…
Engine.fromPosts({path: '/path/to/posts'}).then(function(engine) {
engine.registerWith(framework).then(function(framePage) {
engine.showPostsOn(framePage);
});
});
以上是 JavaScript让构造函数返回Promise是不好的做法吗? 的全部内容, 来源链接: utcz.com/qa/406239.html