2016-05-23 2 views
1

У меня есть объект js, и у меня есть метод, который вызывает другой метод и получает обещание, но изнутри .then() Я не могу получить доступ к функции-члену foo(). Почему я не могу получить доступ к foo() и как я могу получить к нему доступ? Вот мой код:Как вы называете методы объекта из обещания .then()?

function LoadImageGroupFormat() { 
 
    return new Promise(function(resolve, reject) { 
 
     var xhttp = new XMLHttpRequest(); 
 
     xhttp.open('GET', "imagegroup_format.txt"); 
 
     xhttp.onload = function() { 
 
     if (xhttp.status == 200) resolve(xhttp.responseText); 
 
     else reject(Error(xhttp.statusText)); 
 
     }; 
 
     xhttp.onerror = function() { 
 
     reject(Error("Network Error")); 
 
     }; 
 
     xhttp.send(); 
 
    }); 
 
    } 
 
    //the object 
 
var Registerhandler = { 
 
    imageGroupIndex: 0, 
 

 
    foo: function() { 
 
    //Do something else here 
 
    }, 
 

 
    GetImageGroupFormat: function() { 
 
    var imageGroupIndex = this.imageGroupIndex; 
 
    LoadImageGroupFormat().then(function(ImageGroup_Format) { 
 
     //Do something with ImageGroup_Format 
 
     imageGroupIndex++; //This works 
 
     foo(); //Doesn't work - undefined 
 
    }, function(error) { 
 
     console.error("Failed to Load ImageGroup Format", error); 
 
    }); 
 
    } 
 
}

Спасибо за любую помощь по этому вопросу.

+1

'imageGroupIndex ++;' "работает", потому что вы сделали локальную переменную 'imageGroupIndex', оно не изменяющее' Registerhandler.imageGroupIndex' –

+0

Как я могу изменить переменную экземпляра,? –

ответ

1

foo - это свойство, а не имя функции/переменной, его нужно вызвать с помощью синтаксиса свойства. А поскольку не сохраняется в закрытии, вам нужно определить локальную переменную закрытия, чтобы ее удержать.

Чтобы обновить это свойство, вам необходимо использовать self.imageGroupIndex, иначе вы увеличиваете копию значения.

var Registerhandler = { 
    imageGroupIndex: 0, 

    foo: function() { 
    //Do something else here 
    }, 

    GetImageGroupFormat: function() { 
    var self = this; 
    LoadImageGroupFormat().then(function(ImageGroup_Format) { 
     //Do something with ImageGroup_Format 
     self.imageGroupIndex++; 
     self.foo(); 
    }, function(error) { 
     console.error("Failed to Load ImageGroup Format", error); 
    }); 
    } 
} 
1

Использование Function.prototype.bind(), Метод bind() создает новую функцию, которая при вызове, имеет свою this набора ключевых слов предоставленному значения, с заданной последовательностью рассуждений, предшествовавших любой при условии, когда новая функция вызывается ,

function LoadImageGroupFormat() { 
 
    return new Promise(function(resolve, reject) { 
 
    resolve('success!'); //updated fro demonstration purpose 
 
    }); 
 
} 
 
var Registerhandler = { 
 
    imageGroupIndex: 0, 
 
    foo: function() { 
 
    alert('In foo!'); 
 
    }, 
 

 
    GetImageGroupFormat: function() { 
 
    var imageGroupIndex = this.imageGroupIndex; 
 
    LoadImageGroupFormat().then(function(ImageGroup_Format) { 
 
     console.log(ImageGroup_Format); 
 
     this.imageGroupIndex++; 
 
     this.foo(); 
 
    }.bind(this), function(error) { 
 
     console.error("Failed to Load ImageGroup Format", error); 
 
    }); 
 
    } 
 
} 
 
Registerhandler.GetImageGroupFormat();

+0

Я не думаю, что это сработает. В то время, когда вы вызываете '.bind', вы не находитесь в методе объекта, поэтому' this' не задано для объекта. – Barmar

+0

@ Бармар, я предоставил демо. Позвольте мне знать, что это терпит неудачу. – Rayon

+0

@Barmar Да, вы есть. 'bind' непосредственно вызывается в методе GetImageGroupFormat. –

Смежные вопросы