当前位置: 首页 > 面试题库 >

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

詹联
2023-03-14
问题内容

我正在尝试为博客平台创建一个构造函数,并且内部进行了许多异步操作。这些范围包括从目录中获取帖子,对其进行解析,通过模板引擎发送它们,等等。

所以我的问题是,让我的构造函数返回一个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);
    });
});


 类似资料:
  • 问题内容: 我正在尝试为博客平台创建一个构造函数,并且其中包含许多异步操作。这些范围包括从目录中获取帖子,对其进行解析,通过模板引擎发送它们,等等。 所以我的问题是,让我的构造函数返回一个promise而不是调用它们的函数的对象是不明智的。 例如: 现在,用户可能 还不 提供补充的Promise链接: 这可能会带来问题,因为用户可能会感到困惑,为什么 在构造后仍然无法使用。 在构造函数中使用Pro

  • 假设我有一个类来为游戏中的一个项目建模,如下所示: (假设正确重写的和以比较内部枚举) 现在我想要一种方法来用中的getter来区分这些项:我应该返回还是名称?一般情况下返回是好的做法吗?或者是否有更好的方法来区分这些s?因为返回枚举类似于向我公开rep,而且我不希望我的同事直接使用来比较的 我想到的办法如下: 执行类似; 要执行; ; 要执行; 我不知道该怎么做,我希望有经验的程序员能给我一些启

  • 问题内容: 假设我有这段代码 我想知道的是该函数是否将异步执行。 问题答案: 设完成为Call(执行者,未定义,«resolvingFunctions。[[Resolve]],resolvingFunctions。[[Reject]]»)。 如果完成是突然完成,则 令status为Call(resolvevingFunctions。[[Reject]],undefined,«completion。

  • 问题内容: 一般而言,制作所有字段是一个好主意,但有时我发现自己在构造函数中做了所有事情。最近,我结束了一个类实际上做的 一切都 在构造函数中,包括读取属性文件并访问数据库。 一方面,这就是该类的用途,它封装了读取的数据,我喜欢创建完全初始化的对象。构造函数完全不复杂,因为它委派了大部分工作,因此看起来不错。 另一方面,感觉有点奇怪。此外,在大约17:58的演讲中,有充分的理由不对构造函数进行过多

  • 我试图了解异步/等待如何与promise一起工作。 据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语

  • 问题内容: 如果我在构造函数中返回一些值或对象,那么var会得到什么? 在两种情况下都会得到什么n? 其实这是一个测验问题,答案是什么? 自定义对象构造函数返回什么? a)新实例化的对象 b)未定义-构造函数不返回值 c)不论return语句是 d)等于return语句是什么;新实例化的对象(如果没有return语句) 问题答案: 我发现了这个很棒的链接: 上面提到的第二点魔术是构造函数返回特定的