Класс ООП Javascript - назначение свойства функции - PullRequest
0 голосов
/ 07 декабря 2011

Возможно, это уже было решено, но не смог найти подходящий ответ здесь. Извиняюсь, если это так. Вот проблема:

function Aclass(){

    this.value1 = "a first value"
    this.value2 = pulldata()

    function pulldata(){
        $.getJSON("data.json",function(data){
            return data
        })
    }
}

var obj = new Aclass()
console.log(obj.value1)
console.log(obj.value2)

Результат: «первое значение», а затем «неопределенное» Переменная данных недоступна за пределами области действия данных, и я не уверен, как лучше это обойти.

Ответы [ 2 ]

3 голосов
/ 07 декабря 2011

Ваша pullData() функция на самом деле ничего не возвращает явно, поэтому ее возвращение не определено - это означает, что то, что вы видите, когда вы регистрируете obj.value2, является правильным (хотя и нежелательным).

Внутри pullData() вы вызываете $.getJSON() и передаете ей анонимную функцию в качестве обратного вызова, и именно эта анонимная функция возвращает data, но возврат никуда не идет, потому что вызов ajax является асинхронным, и обратный вызов не происходит до тех пор, покапозже.

Вы можете попробовать это:

function Aclass(classInitialisedCallback){
    var self = this;

    this.value1 = "a first value";
    this.value2 = "not available yet";

    $.getJSON("data.json",function(data){
        self.value2 = data;
        if (typeof classInitialisedCallback === "function")
           classInitialisedCallback(self);
    });
}

var obj = new Aclass(function(newInstance) {
   // can use obj or newInstance to refer to the object
   console.log(obj.value1);
   console.log(newInstance.value2);
});

То есть, настройте ваш конструктор Aclass() так, чтобы он принимал параметр, который является функцией обратного вызова, которая будет выполнена, когда класс будет готов,то есть после того, как результат из $.getJSON() доступен.

1 голос
/ 07 декабря 2011

$. GetJSON выполняет асинхронный ajax-вызов вашего URL-адреса «data.json». Второй аргумент, который вы указали, - это обратный вызов, который вызывается после завершения вызова ajax. Однако ваша функция pulldata просто проходит, не дожидаясь ответа, и, следовательно, возвращает undefined.

Невозможно сделать именно то, что вы пытаетесь сделать с асинхронными вызовами (и вы никогда не должны использовать синхронные вызовы).

Вам придется переписать свой код, чтобы вместо этого выполнить свои действия в обратном вызове. Обратный вызов - это ваш аргумент "function (data) {}".

Однако если вызванная вами функция не была асинхронной, вот как работает область JS, и она должна была решить вашу проблему:

function Aclass() {
    var that = this;
    this.value2 = 'not set';

    var pullData = function() {
        someCallToSomethingWithACallback(function() {
            that.value2 = 'set';
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...