0

次の JavaScript オブジェクトがあります。

var UsersControl = {
    users: null,
    fetchData: function() {
        $.ajax({
            type: "GET",
            dataType: "json",
            context: this,
            url: "../php/client/json.php",
            data: {
                type: "users"
            }
        }).done(function(response) {
            this.users = response;
        });
    },
    getData: function() {
        if (this.users == null) {
            this.fetchData();
        }
        return this.users;
    }
};

getData()メソッドを実行すると、usersフィールドは既に定義されていますがnull、この呼び出しでは古い値 ( ) が返されます。次の呼び出しでは、適切な値 (ajax-ed) が返されます。JavaScript コンソール セッションの例:

> UsersControl
> Object {users: null, fetchData: function, getData: function}

> UsersControl.getData()
> null

> UsersControl
> Object {users: Array[2], fetchData: function, getData: function}

> UsersControl.getData()
> [Object, Object]

メソッドが呼び出されたときにJavaScriptがオブジェクトの現在の状態を記憶しているように見えます-そして、メソッドが終了した後にすべての状態の変更が適用されます。ただし、これにより、オブジェクト フィールドの変更をその場で実行することができなくなります (これまでに使用したすべての OOP 言語と同様)。または、単純に、どこかにバグがあります。このトピックに関するヒントをいただければ幸いです。

4

1 に答える 1

0

愚かな私...それはシンクロニシティの問題でした...

fetchData: function() {
    $.ajax({
        type: "GET",
        dataType: "json",
        context: this,
        url: "../php/client/json.php",
        async:   false,               // <- note this
        data: {
            type: "users"
        }
    }).done(function(response) {
        this.users = response;
    });
},
于 2013-03-29T23:47:45.333 に答える