我很可能犯了一些明显的背景或范围错误,但我无法弄清楚我做错了什么。这是一个小例子来说明我遇到的问题。
拥有以下main.js javascript:
$(function() {
/**
* Returns a promise that resolvses the provided parameter `something`
* after 4 seconds.
*/
function async(something) {
var deferred = $.Deferred();
setTimeout(function() {
deferred.resolve(something);
}, 4000);
return deferred;
}
/**
* Some object with a name and response property.
*/
var SomeObj = function(name) {
this.name = name;
this.response = null;
this.init();
}
SomeObj.prototype.init = function() {
self = this;
async(this.name).then(function(response) {
self.setResponse(response);
});
};
SomeObj.prototype.setResponse = function(response) {
this.response = response;
console.log(this);
console.log(response);
};
objA = new SomeObj('a');
objB = new SomeObj('b');
});
这是在空的HTML页面中执行的:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>title</title>
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="main.js"></script>
</head>
<body>
</body>
</html>
使用以下命令将jquery安装在同一目录中:
bower install jquery
在javascript文件的底部,使用name
属性初始化了两个对象。在初始化期间,这些对象将其response
属性设置为相同的值,该值由async
函数作为promise返回。此函数只需在四秒后解析输入参数。
使用此脚本,我希望(等待4秒后)response
的{{1}}属性设置为ObjA
,a
属性设置为{{1} }}设置为response
。但是,控制台显示以下结果:
objB
显然,在这两种情况下都会调用b
的{{1}}函数。但为什么呢?
答案 0 :(得分:2)
这是你的问题:
SomeObj.prototype.init = function() { self = this;
self
是global variable,由第二个实例覆盖,并由两个回调引用。做到这一点
var self = this;
您的代码将起作用。 (也就是说,create a promise in your constructor不是最好的想法并且异步创建.response
属性