相关疑难解决方法(0)

让构造函数返回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();
});
Run Code Online (Sandbox Code Playgroud)

现在,用户可能还没有提供补充Promise链链接:

var engine = new Engine({path: '/path/to/posts'});

// ERROR
// engine will not be available as an Engine object here
Run Code Online (Sandbox Code Playgroud)

这可能会造成问题,因为用户可能会感到困惑,为什么 engine 在施工后无法使用.

在构造函数中使用Promise的原因是有道理的.我希望整个博客在构建阶段后正常运行.然而,在呼叫之后,它似乎几乎无法立即访问该对象new.

我一直在争论使用的东西,engine.start().then()或者engine.init()会返回Promise.但那些看起来也很臭.

编辑:这是在Node.js项目中.

javascript architecture constructor node.js promise

150
推荐指数
3
解决办法
4万
查看次数

在构造函数中调用异步函数。

getUser是一个异步函数吗?是否需要更长的时间解决?是否总是返回我的正确的价值someotherclass

class IdpServer {
    constructor() {
        this._settings = {
            // some identity server settings.
        };
        this.userManager = new UserManager(this._settings);
        this.getUser();
    }

    async getUser() {
        this.user = await this.userManager.getUser();
    }

    isLoggedIn() {
        return this.user != null && !this.user.expired;
    }
}

let idpServer = new IdpServer();
export default idpServer;


// another class 
// import IdpServer from '...'
 class SomeOtherClass {
     constructor() {
        console.log(IdpServer.isLoggedIn());
     }
 }
Run Code Online (Sandbox Code Playgroud)

javascript asynchronous ecmascript-6 identityserver4

6
推荐指数
1
解决办法
4640
查看次数

Aureliajs在App构造函数上等待数据

我正在用aureliajs开发一个应用程序。开发过程开始了许多个月,现在,后端开发人员希望对他们的服务进行版本控制。因此,我有一个Web服务可调用以获取每个服务器端(Web api)应用程序的版本,然后针对进一步的请求,调用正确的api地址(包括其版本)。

因此,在app.js中,我请求系统元并将其存储在某处。但是某些组件在此请求完成之前已初始化。因此,他们将找不到初始化的版本并请求错误的服务器数据。

我想让app.js构造函数等到检索到此数据。例如这样的事情:

export class App {
  async constructor(...) {
    ...

    await this.initializeHttp();

    ...
  }

  initializeHttp(){
    // get the system meta from server
  }
}
Run Code Online (Sandbox Code Playgroud)

但是此解决方案不适用。因为构造函数不能异步。因此,在检索系统元之前,我应该如何阻止该工作?

更新

这个问题不是这个问题的重复。在这个问题中,外部类中有一个地方等待初始化工作;尽管在我的问题中,主要的问题是等待的位置。因此,问题不仅仅在于构造函数中的异步函数,还在于在异步作业解决之前,阻止所有aurelia作业。

javascript promise async-await ecmascript-6 aurelia

5
推荐指数
1
解决办法
67
查看次数