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

Posted

技术标签:

【中文标题】如何在构造函数中调用promise对象来设置属性[重复]【英文标题】:How to call promise object in constructor to set a property [duplicate] 【发布时间】: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;

【问题讨论】:

【参考方案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; 发生之后执行。

以上是关于如何在构造函数中调用promise对象来设置属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

构造函数、ECMAscript(ES6)

构造函数和原型

JS中异步编程解决方案Promise

设置状态的新 Promise 接收箭头函数

为啥在父类的构造函数中调用重载函数时,在 ES6 类上设置属性不起作用

我如何访问这个 Promise 调用中的历史对象?