2016-04-15 11 views
0

Ich versuche JavaScript in synchrone Verhalten zu koaxial, aber ich habe bisher gescheitert.Synchron AJAX (gebrochene Versprechen)

I 30 oder mehr verschiedene Methoden ausprobiert habe, und hier ist der neueste Versuch, basierend auf einer anderen Antwort hier auf StackOverflow:

function fnc() { 
    $.ajax({ 
     type: 'GET', 
     url: "libraries/resources/data.json", 
     dataType: 'json', 
     success: function (data) { 
      ... 
      objSomething = { 
       ... 
      }; 
    }, 
     error: function() {} 
    }); 
} 
fnc().then(function(objSomething) { 
    google.maps.event.addDomListener(window, 'load', function(){ initialize(objSomething); }); 
}).catch(function(objSomething) { 
    ... 
}); 

aber ich erhalte eine Fehlermeldung:

TypeError: undefined is not an object (evaluating 'fnc().then')

Die meisten Methoden, die ich versucht habe, haben ähnliche Fehler ergeben.

Wie für den Google Maps-Code funktioniert es (aber nicht immer, aufgrund der asynchronen Art der Codeausführung).

Es ist erwähnenswert, dass, während ich in der Lage bin, komplexen Code von Grund auf neu zu schreiben, wenn es um die zugrunde liegende Mechanik geht, bin ich nicht so kompetent.

Ich benutze jQuery 2.2.2, über die Google API CDN.

+4

Ihre 'fnc' Funktion gibt nichts zurück, so dass Sie nicht tun können,' fnc(), dann() '... – Cristy

+0

@Cristy, basierend auf den Beispielen I‘. Ich habe versucht, einige hatten eine Rückmeldung, andere nicht. Ich habe eine Rückgabeanweisung ausprobiert und es funktioniert nicht. Ich würde ein Beispiel dafür schätzen, was - Ihrer Meinung nach - funktionieren sollte. –

+0

@WayneSmallman \t "Es funktioniert nicht" liefert nicht genügend Informationen zur Diagnose. Wenn eine Funktion nichts zurückgibt, können Sie nichts auf ihrem Rückgabewert aufrufen. Wenn es einen Beispielvorschlag gibt, können Sie dieses Beispiel falsch angeben. –

Antwort

3

Dies ist eine Lösung, nach der Sie suchen.

function fnc() { 
     var dfd = jQuery.Deferred(); 
     $.ajax({ 
      type: 'GET', 
      url: "libraries/resources/data.json", 
      dataType: 'json', 
      success: function (data) { 
       ... 
       objSomething = { 
        ... 
       }; 
      dfd.resolve(objSomething); 
     }, 
      error: function (error) { dfd.reject(error); } 
     }); 

     return dfd.promise(); 
    } 

    $.when(fnc()).then(function(objSomething) { 
     google.maps.event.addDomListener(window, 'load', function(){ 
      initialize(objSomething); 
     }); 
    }, function(error){ 
     //Handle Error 
    }); 
+0

@ p-janowski, danke! –

0

Verwendung $.ajax Funktion können Sie die then-Funktion verwenden. Siehe den folgenden Link:

http://wildermuth.com/2013/8/3/JavaScript_Promises