2016-05-26 3 views
1

Also bin ich in modularen Javascript und ich stieß auf eine Straßensperre beim Versuch, eine jQuery http Anfrage in mein Modul zu integrieren. Ich weiß nicht, wie ich das nennen soll, also entschuldige ich mich, wenn der Titel irreführend ist.Call-Objekt-Methode aus dem Inneren von jQuery.get()

var object = { 
    init: function() { 
     this.loadRequest(); 
    }, 
    loadRequest: function() { 
     $.get('https://myurl.com', function(data) { 
      this.parseRequest.bind(this) 
     }); 
    }, 
    parseRequest: function(data) { 
     console.log(data); 
    } 
}; 

object.init(); 

Wenn ich das versuchen, Chrome sagt mir:

Uncaught TypeError: Cannot read property 'bind' of undefined 

Also ich denke, es hat etwas mit, wie ich verbindlich die Methode zu meinem Objekt zu tun hat, aber ich kann nicht zu Figur scheinen heraus, wie es funktioniert.

+0

Es ist zu spät ; "Das ist schon falsch". Sie müssen lernen, was 'bind' tatsächlich tut. – SLaks

+1

'$ .get ('https://myurl.com', this.parseRequest.bind (this));' – nnnnnn

Antwort

1

Sie haben einige Missverständnisse auf, was eigentlich this in anderem Zusammenhang bezieht. Ich empfehle Ihnen dringend, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this zu lesen, um eine bessere Vorstellung davon zu haben, was this betrifft, weil es ein wichtiges Konzept ist.

Hier ist eine Fehlerbehebung für Ihren Code. Wenn Sie die bind()

var object = { 
    init: function() { 
     this.loadRequest(); 
    }, 
    loadRequest: function() { 
     $.get('https://myurl.com', this.parseRequest.bind(this)); 
    }, 
    parseRequest: function(data) { 
     console.log(data); 
    } 
}; 

object.init(); 

JSFiddle verwenden: https://jsfiddle.net/rtbbc74m/

Ein anderer Ansatz häufig verwendet wird, ist var self = this (Lesen Sie auch: How to use the self with object-oriented javascript and closures):

var object = { 
    init: function() { 
     this.loadRequest(); 
    }, 
    loadRequest: function() { 
     var self = this; 
     $.get('https://myurl.com', function(data) { 
      self.parseRequest(data); 
     }); 
    }, 
    parseRequest: function(data) { 
     console.log(data); 
    } 
}; 

object.init(); 

JSFiddle: https://jsfiddle.net/tz680b1c/

+1

'$ .get ('https://myurl.com', this.parseRequest.bind (this)); 'gibt Ihnen das gleiche Ergebnis ohne den ganzen Aufwand einer Wrapper-Funktion. Aber im Hinblick auf den Wrapper müssen Sie die 'Callback'-Variable nicht wirklich definieren: Sie können' .bind() 'in der anonymen Funktion direkt an dem Punkt aufrufen, an dem sie an' $ .get() 'übergeben wird. 'this.parseRequest.bind (data);' sollte 'this.parseRequest (data)' sein. – nnnnnn

+0

@nnnnnn Danke, dass Sie mich auf den Fehler in this.parseRequest.bind (data) hingewiesen haben. '. Ich habe eine falsche Version von JSFiddle kopiert. Außerdem ist '$ .get ('https://myurl.com', this.parseRequest.bind (this));' besser als ein Callback zu deklarieren. Ich habe meine Antwort aktualisiert. – user6383968

Verwandte Themen