【问题标题】:How to call promise object in constructor to set a property [duplicate]如何在构造函数中调用promise对象来设置属性[重复]
【发布时间】:2017-02-11 17:37:48
【问题描述】:

我是 javascript 新手,我需要一些帮助来了解应如何使用 promises(使用 bluebird)。下面是我的代码,我希望构造函数在属性解析后初始化一个属性。

var getCookie = function(object, someParams) {
   return connect(someParams)
   .then(function(response){
      self.cookie = response.cookie;//this should be done as part of object initialization.
      done();
    });
}

var app = function(){
  var self = this;
  getCookie(self);
  //how to make sure that return happens after promise is resolved?
  return self;
}

【问题讨论】:

    标签: javascript promise


    【解决方案1】:

    如何确保在 promise 解决后返回?

    你不能。 app 函数将在 promise 解决之前返回。 JavaScript 甚至可以保证这一点。

    如何在构造函数中调用promise对象来设置属性

    你没有。

    相反,您有类似工厂方法的东西,它创建类的新实例,并返回解析为实例的 Promise。

    例子:

    function getCookie(someParams) {
     return connect(someParams)
       .then(function(response){
         return response.cookie;
       });
    }
    
    function App() {}
    
    function getApp() {
      var app = new App();
      return getCookie(params)
        .then(function (cookie) {
          app.cookie = cookie;
          return app;
        });
    }
    
    // Usage
    
    getApp().then(function(app) {
      // use app
    });
    

    异步 进程使用 Promise。构造函数是同步的。虽然您可以在构造函数中使用 Promise,但在解决 Promise 之前,返回的实例不会被完全初始化。但是你的代码永远不会知道那是什么时候。

    这就是为什么有一个工厂方法返回一个可以解析为类实例的承诺,如果更可靠的话。

    【讨论】:

    • 我尝试了这种方法,但发生的事情是应用程序在没有设置 cookie 的情况下被返回。它在某个时间后被设置......我们如何确保它在完成承诺之前不会返回?我们必须添加一个承诺监视器吗?我知道这听起来更像是同步编程,但我使用的 api 只返回承诺
    • 那么您没有按照我在回答中的建议进行操作。这是一个带有假 connect 实现的实现:jsfiddle.net/yqu5szLb。 “我们必须添加一个 Promise 监视器吗?” 不需要。Promise 已经解决了这个问题。传递给 getApp().then(...) 的回调仅在 app.cookie = cookie; 发生之后执行。
    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2014-01-05
    • 2015-08-12
    • 2018-05-11
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    相关资源
    最近更新 更多