如何在构造函数中调用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对象来设置属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章