Создайте ссылку на метод с параметрами, которые используют ту же область - в Javascript - PullRequest
1 голос
/ 28 ноября 2011

Я получил несколько методов (methA, methB ...), которые должны вызывать тот же метод methMain в Javascript. Этот метод methMain затем должен извлечь некоторые данные и, когда это будет сделано, сделать обратный вызов метода, который его вызвал (methA или MethB ...).

Я могу успешно создать указатель / ссылку на метод, используя то, что написано здесь: Как передать ссылку на функцию с параметрами?

Это решение, как и все другие, которые я видел, похоже, не работает в текущей области. Этот код не будет работать:

function TestStructure() {

    this.gotData = false;

    //define functions
    this.methA = function (parA) { };
    this.methB = function (parb) { };
    this.createFunctionPointer = function (func) { };


    this.createFunctionPointer = function (func /*, 0..n args */) {
        var args = Array.prototype.slice.call(arguments, 1);
        return function () {
            var allArguments = args.concat(Array.prototype.slice.call(arguments));
            return func.apply(this, allArguments);
        };
    };

    this.methA = function (parA) {

        alert('gotData: ' + this.gotData + ', parA: ' + parA);

        if (this.gotData == false) {
            var fp = this.createFunctionPointer(this.methA, parA);
            this.methMain(fp);
            return;
        }

        //...do stuff with data
    }

    this.methB = function (parB) {

        alert('gotData: ' + this.gotData + ', parB: ' + parB);

        if (this.gotData == false) {
            var fp = this.createFunctionPointer(this.methB, parB);
            this.methMain(fp);
            return;
        }

        //...do stuff with data
    }

    this.methMain = function (func) {

        //...get some data with ajax

        this.gotData = true;

        //callback to function passed in as parameter
        func();
    }
}

var t = new TestStructure();
t.methA('test');

Когда methMain выполняет обратный вызов func (methA или methB), переменная this.gotData не будет установлена.

Есть ли решение этой проблемы или мне нужно переосмыслить дизайн? Я хочу сделать это, чтобы получить данные с помощью ajax без блокировки с помощью async: false.

1 Ответ

0 голосов
/ 28 ноября 2011

Я не уверен на 100%, но я думаю, что вы можете решить вашу проблему, выполнив

this.createFunctionPointer = function (func /*, 0..n args */) {
    var args = Array.prototype.slice.call(arguments, 1);
    var that = this; //<<< here
    return function () {
        var allArguments = args.concat(Array.prototype.slice.call(arguments));
        return func.apply(that, allArguments);
                   //here ^^^
    };
};

Это приведет к тому, что ваша частично оцененная функция будет вызываться с тем же this, который создал указатель функции.Если вы хотите другую область, просто измените все, что вы передаете на .apply.

...