由两个不同对象调用的两个promise结果都分配给其中一个对象

时间:2015-06-18 12:39:24

标签: javascript jquery

我很可能犯了一些明显的背景或范围错误,但我无法弄清楚我做错了什么。这是一个小例子来说明我遇到的问题。

拥有以下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}}属性设置为ObjAa属性设置为{{1} }}设置为response。但是,控制台显示以下结果:

objB

显然,在这两种情况下都会调用b的{​​{1}}函数。但为什么呢?

1 个答案:

答案 0 :(得分:2)

这是你的问题:

SomeObj.prototype.init = function() {
    self = this;

selfglobal variable,由第二个实例覆盖,并由两个回调引用。做到这一点

    var self = this;

您的代码将起作用。 (也就是说,create a promise in your constructor不是最好的想法并且异步创建.response属性