webentwicklung-frage-antwort-db.com.de

getJSON Synchronous

ZIEL: Was ich will, ist, Daten aus der Datenbank abzurufen und die Datei main.php (deutlicher durch draw_polygon) jedes Mal zu aktualisieren, wenn etwas in der Datenbank hinzugefügt wird (nach $ .ajax bis submit_to_db.php).

Also im Grunde habe ich eine main.php, die ajax eine andere PHP-Datei aufruft, um ein Array zu erhalten, das in der Datenbank gespeichert wird, und eine json-Datei, die eine andere PHP-Datei aufruft, um ein Array zurückzugeben, wird von main.php verwendet.

$(document).ready(function() {
    get_from_db();
    $('#button_cancel').click(function(){
       $.ajax({
          url: 'submit_to_db.php',
          type: 'POST',
          data: {list_item: selected_from_list},

          success: function(result){
             ...
             get_from_db();
          }
       });
    });
    function get_from_db(){
         $.getJSON('get_from_db.php', function(data) {
             ...
             draw_polygon(data);
         });
    }
 });

In meinem Fall war das, was ich getan habe, ein get_from_db - Funktionsaufruf für getJSON, um tatsächlich Daten aus der Datenbank abzurufen, wobei die Daten für draw_polygon Verwendet werden. Aber soll es so gemacht werden? Ich bin ein absoluter Neuling und dies ist das erste Mal, dass ich es mit getJSON und Ajax probiere, um ehrlich zu sein. Also meine Frage: Wie funktioniert asynchron eigentlich? Gibt es dafür eine andere Problemumgehung, anstatt die Funktion get_from_db Mit getJSON aufrufen zu müssen (sie ist nicht synchron, oder?)? Deshalb wird die Seite nicht aktualisiert, wenn dies nicht der Fall ist innerhalb einer Funktion?) Die ganze Zeit - wie $.ajax mit async: false (ich konnte es übrigens nicht zum Laufen bringen). Mein Ansatz funktioniert, aber ich dachte, es gibt vielleicht andere bessere Möglichkeiten, dies zu tun. Ich würde gerne lernen, wie. Danke im Voraus. Ich hoffe, ich mache irgendeinen Sinn.

Um es klarer zu machen, möchte ich Folgendes erreichen:

  1. @start Der Seite, Daten aus der Datenbank abrufen (derzeit über getJSON)
  2. Malen oder zeichnen Sie in canvas mit dem data
  3. Wenn ich auf die Schaltfläche "Fertig" klicke, wird die Datenbank aktualisiert
  4. Ich möchte die Daten automatisch erneut abrufen, um die Änderungen in der Zeichenfläche neu zu zeichnen.
35
Fred

Asynchron bedeutet, dass die Anforderung im Hintergrund ausgeführt wird und Ihre Funktion zurückruft, wenn sie eine Antwort erhält. Diese Methode eignet sich am besten, wenn Sie ein Ergebnis haben möchten, aber die Verwendung Ihrer App innerhalb der Anforderung zulassen möchten. Wenn Sie eine direkte Antwort erhalten möchten, sehen Sie sich eine Synchronisierungsanforderung an. Diese Anforderung pausiert die Skriptausführung, bis eine Antwort eingeht, und der Benutzer kann nichts tun, bis die Antwort empfangen wurde. Sie können es umschalten über:

async: false,

Also zum Beispiel:

$.ajax({
    url: "myurl",
    async: false,
    ...
})
21
tobspr

Da $ .getJSON () Ajax-Konfigurationen verwendet, legen Sie einfach die globalen Ajax-Konfigurationen fest:

// Set the global configs to synchronous 
$.ajaxSetup({
    async: false
});

// Your $.getJSON() request is now synchronous...

// Set the global configs back to asynchronous 
$.ajaxSetup({
    async: true
});
47
cchristelis

$ .getJSON () akzeptiert keine Konfiguration, wie es in den Dokumenten heißt, es ist eine Kurzversion von:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});

Schreiben Sie Ihre Anfrage einfach in diesem Sinne um und async: false wird genau so funktionieren, wie Sie es erwarten.

19
Robert Moskal

$.getJSON() ist eine Kurzschreibweise für $.ajax(), die synchron konfiguriert werden kann (siehe jQuery.getJSON und JQuery.ajax ) :

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  async: false, 
  success: function(data) {
      ...
      draw_polygon(data);
  }
});

Versuchen Sie, synchrone Anrufe zu vermeiden. Zitat aus jQuery doc (siehe asynchrone Requisite) :

Domänenübergreifende Anforderungen und Datentyp: "jsonp" -Anforderungen unterstützen den synchronen Betrieb nicht. Beachten Sie, dass synchrone Anforderungen den Browser möglicherweise vorübergehend sperren und alle Aktionen deaktivieren, während die Anforderung aktiv ist.

Vielleicht möchten Sie jQuery Deferreds wie folgt ausprobieren:

var jqxhr = $.getJSON(url);
jqxhr.done(function(data) {
    ...
    draw_polygon(data);
});
10
R. Oosterholt