2017-12-11 4 views
0

Ich muss jQuerys getJSON-Funktion überschreiben und frage mich, ob es eine Möglichkeit gibt, innerhalb der Override-Funktion Versprechungsfunktionen (done/fail) zu bekommen. Ich würde denken, dass die Funktionen irgendwo gespeichert sind. Hier ist der Beginn des Codes:Überschreibe getJSON und bekomme jQuery Versprechen (done/fail)

(function ($) { 
    $.getJSON = function (url, data, callback) { 
     this.done = function(){}; 
     this.fail = function(){}; 
     var newDoneFtn = function(response) { 
      var newData = JSON.parse(response.data); 
      //call done function here with newData variable 
     } 
     var newFailFtn = function() { 
      //call fail function here 
     } 
     newFunction(url, data, newDoneFtn, newFailFtn); 
    }; 
})(jQuery); 

$.getJSON(someURL, { 
    id: 1 
}).done(function(data) { 
    console.log(data); 
}).fail(function() { 
    console.log('failed'); 
}); 

Wo ich stecken bin versucht, das zu tun bekommen und gescheiterten Funktionen auf dem getJSON Aufruf mit dem newFunction verwendet werden. Bitte beachten Sie, dass ich newFunction nicht ändern kann.

+0

Nein, Sie nur ein jQuery latenten zurückkehren müssen: Sie können eine $.Deferred zurück. – Bergi

+0

Warum denken Sie, dass Sie 'getJSON' überschreiben müssen? Was ist Ihr [tatsächliches Problem] (https://meta.stackexchange.com/q/66377)? – Bergi

+0

Ich habe es mit einem Android-Problem in Cordova zu tun und möchte nicht jede getJSON-Funktion neu schreiben müssen, um die cordova.plugin.http.get-Funktion für ältere Android-Versionen (vor 5) zu verwenden. Habe das nicht erwähnt, da ich die Dinge nicht zu kompliziert machen wollte. – fanfavorite

Antwort

1

Sie sollten ein neues verzögertes Objekt mit $.Deferred() erstellen.

Sie können dann die resolve() und reject() Funktionen aufrufen/übergeben, um das Versprechen zu lösen oder nicht zu erfüllen.

+0

Können Sie ein Beispiel geben? Ich kann Versprechungen für die newFunction nicht verwenden und muss die Funktionsvariable wie oben gezeigt übergeben. – fanfavorite

+0

@fanfavorite: Das ist, was die 'resolve' &' reject' Methoden auf 'Deferred' sind. Siehe die Dokumentation. – SLaks

+0

Was passiert, wenn mehrere getJSON-Anrufe gleichzeitig stattfinden? Würde das verzögerte Objekt nicht alle lösen, anstatt nur das, was tatsächlich gemacht wird? – fanfavorite

1

Da SLaks bereits beantwortet;

function getJson(){ 
    var deferred = $.Deferred(); 
    try{ 
    someCallbackApi(
     param 
     ,function(response){ 
     response.error 
      ? deferred.reject(response.error) 
      : deferred.resolve(JSON.parse(response.data)) 
     } 
    ); 
    }catch(e){ 
    deferred.reject(e); 
    } 
    return deferred.promise(); 
} 
+0

Wenn ich dies tue, bekomme ich einen Fehler, dass $ .getJSON (...). Done keine Funktion ist und obwohl die Funktion callbackApi complete ausgelöst wird, ruft die deferred.resolve die done-Funktion nicht auf. Ich habe im Grunde Ihren Code innerhalb dessen, was ich oben habe, eingerichtet. Siehe diese Geige http://jsfiddle.net/brudm47/1/ – fanfavorite

+1

Nevermind, ich fand, dass sollte zurück defered.promise() sein. Ich habe deine Antwort bearbeitet. Vielen Dank. – fanfavorite