我想在Javascript中创建一个对象。
其中一种方法应该执行一个承诺链。链中的每个方法都必须访问作为对象成员的配置变量。
问题是,this
运算符在PromiseMethod2
中已更改,我无法访问配置变量(它在PromiseMethod1
中正常工作)。
这是我的代码:
var SomeObject(config) {
var that = this;
that.config = config;
}
SomeObject.prototype.SomeMethod = function() {
var that = this;
that.PromiseMethod1()
.then(that.PromiseMethod2)
.catch(console.error);
}
SomeObject.prototype.PromiseMethod1 = function() {
var that = this;
config = that.config;
return SomePromise();
}
SomeObject.prototype.PromiseMethod2 = function(someParams) {
var that = this;
config = that.config;
params = someParams;
return SomePromise();
}
var someObject = new SomeObject(someConfig);
someObject.SomeMethod().then(function () {
console.log('Done!');
}
我想在链中使用委托方法而不是仅执行:
that.PromiseMethod1().then(function(response) { return that.PromiseMethod2(that, response); };
我无法使用bind
方法,因为它在执行回调时看起来会被重新绑定。
有解决方案吗?
为什么PromiseMethod1
和PromiseMethod2
之间存在差异?
答案 0 :(得分:0)
我会说这是不可能的。您尝试混合两种不同的方法:method chaining和promises chaining。我建议您检查一下您的架构。
唯一可见的东西(但我个人并不喜欢),如果你完全控制你想要使用的所有承诺,就是通过整个承诺链传递配置值。
SomeObject.prototype.init = function() {
var that = this;
return new Promise(function(resolve, reject) {
resolve(that.config)
});
}
SomeObject.prototype.PromiseMethod1 = function(config, params) {
return SomePromise(config, params);
}
SomeObject.prototype.PromiseMethod2 = function(config, someParams) {
return SomePromise(config, someParams);
}
SomePromise = function(config, params) {
return new Promise(function(resolve, reject) {
//some code here
resolve(config, newParamsFromSomeCode)
});
}
然后你就可以打电话了:
that.init().then(that.PromiseMethod1).then(that.PromiseMethod2);
但同样,它看起来并不像一个好的代码......