访问'这'promise回调中的对象(然后)
Accessing 'this' of an object inside promise callback (then)
我想用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!');
}
我想在链中使用方法delegate,而不仅仅是执行:
that.PromiseMethod1().then(function(response) { return that.PromiseMethod2(that, response); };
我不能使用bind
方法,因为它看起来像是在执行回调时被重新绑定的。
有解决办法吗?为什么PromiseMethod1
和PromiseMethod2
之间有区别?
我的real建议是根本不要使用this
或new
(如果您仍然想要继承,则可以使用Object.create
):
var SomeObject = function(config) {
return {
PromiseMethod1: function(){
return somePromise(config.foo);
},
PromiseMethod2: function(x){
return someOtherPromise(config.bar, x);
}
}
}
var instance = SomeObject({config: true});
instance.PromiseMethod1().then(instance.PromiseMethod2);
在这里,我使用闭包,以及它们封装父词法范围的变量的能力,这对我来说是有利的。与其依赖JavaScript在运行时根据调用函数的对象将this
神奇地注入函数,因为正如您的问题所证明的那样,这并不总是有效的。
然而,我知道这是一种非传统的工作方式,所以如果你想坚持使用this
,你需要使用bind
来告诉JavaScript该函数属于哪个神奇的this
-值:
var SomeObject function(config) {
this.config = config;
}
SomeObject.prototype.PromiseMethod1 = function(){
return somePromise(this.config.foo);
}
SomeObject.prototype.PromiseMethod1 = function(x){
return someOtherPromise(this.config.bar, x);
}
var instance = new SomeObject({config: true});
instance.PromiseMethod1().then(instance.PromiseMethod2.bind(instance)); //<- :(
在您的示例SomeMethod
中,您实际上并没有使用bind
。您仍然需要绑定,因为您正在将函数传递到.then(f)
中,而接收该函数的代码不再知道它应该为this
使用哪个对象。现在再次查看我以前推荐的代码。其中没有this
se,因此这些函数根本不依赖于调用它们的对象,您可以随心所欲地将它们作为高阶函数传递,而无需bind
或that = this
。:)
我认为这是不可能的。您尝试混合使用两种不同的方法:方法链接和承诺链接。我建议你复习一下你的体系结构。
如果您对想要使用的所有promise都有完全的控制权,那么唯一可见的事情(但我个人不喜欢)就是通过整个promise链传递配置值。
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);
但是,它看起来并不是一个好的代码。。。
- 将值输入到对象,然后该对象推送到数组
- 如何在鼠标悬停时将对象从起始位置移动到结束位置,然后在鼠标悬停后再次移动
- 搜索包含值的json对象键,然后取消设置
- jQuery Deferred and promise-错误:对象没有't支持属性或方法'然后'
- 使用函数for循环遍历对象以更改值,然后返回结果
- 尝试将对象添加到存储阵列中,然后通过循环将它们写出
- 将普通的 PNG 图像转换为 JSON 数据,然后存储到对象
- 存储多个Json对象,然后对其进行排序
- 我想使用replace函数扫描json对象,然后用字符串替换匹配的单词
- 如何在javascript中生成数组对象的数组,然后将其传递给java
- 从数组中快速打印对象,然后循环
- 根据属性值创建多个对象数组,然后遍历每个数组
- 找到对象中值最高的键,然后将其发布到innerHTML中
- 将JSON字符串转换为JavaScript对象,然后创建一个HTML表
- 无法更新 Javascript 对象文本中的值,然后更新页面
- 复制对象,然后更新 JSON 对象中的值
- 使用 .push 对对象进行分组,然后输出到字符串
- 在函数中创建 jQuery 对象然后不使用它是否会产生内存泄漏
- 访问'这'promise回调中的对象(然后)
- 声明一个javascript对象.然后使用jQuery和Ajax设置属性