栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JavaScript让构造函数返回Promise是不好的做法吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaScript让构造函数返回Promise是不好的做法吗?

是的,这是一个坏习惯。构造函数应该返回其类的实例,而没有别的。否则会弄乱

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);    });});


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/404990.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号