Frage an global-variables, javascript, ajax, post, jquery – Ist es möglich, Ajax Respone außerhalb zu verwenden?

2

Jede Art der Verwendung desdata_response außerhalb von$.post()?

Dies ist ein Teil des Codes, den ich benutze:

$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        var response = data_response; //I need to access this variable outside of $.post()
    }
}, "json");

console.log(response); //response is not defined, is what I get for now
AKTUALISIEREN

Gibt es keine Möglichkeit, diese Antwort weltweit verfügbar zu machen?

Deine Antwort

5   die antwort
1

damit sie auf einen Teil des Codes beschränkt ist, von dem aus Sie darauf zugreifen können:

var response;

$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
    response = data_response; 
    }
}, "json");

console.log(response); //response is now defined - It won't be populated yet though.

Wie bereits im obigen Code erwähnt, wird die Antwort zwar definiert, jedoch nicht zum Zeitpunkt des Aufrufs von console.log ausgefüllt. Wenn Sie jedoch nach dem Auslösen des Rückrufs auf die Variable zugreifen, wird sie ausgefüllt.

Wenn Sie diesen Weg gehen, möchten Sie wahrscheinlich ein Modulmuster oder einen Abschluss verwenden, um zu vermeiden, dass die Antwortvariable in den globalen Bereich eingefügt wird (Sie möchten dies wahrscheinlich trotzdem aus Gründen der Fairness tun).

Crockfords Modulmuster:http://www.yuiblog.com/blog/2007/06/12/module-pattern/

Nein, dasnur Der vernünftige Weg, das OP-Problem zu beheben, besteht darin, entweder den Wert zu verwendenim der Rückruf oder in der Funktionskette, die vom Rückruf aufgerufen wird. Nur zu "hoffen", dass die Variable irgendwann gefüllt wird, ist ein Rezept für eine Katastrophe. Alnitak
Um fair zu sein, denke ich, dass es bei der Frage wirklich um das Scoping von Variablen geht. Offensichtlich wird es nicht gefüllt, bis der Rückruf ausgelöst wurde. Paul
2

$.post wird asynchron ausgeführt, also beim Aufrufconsole.logwird die AJAX-Anforderung noch ausgeführt und hat noch keine Antwort geliefert. Dies ist der Zweck der Rückruffunktion: Code bereitzustellen, der ausgeführt werden sollnach dem Die Anfrage wurde abgeschlossen. Wenn du dich bewegstconsole.log in die Rückruffunktion sollte es funktionieren:

$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        var response = data_response; //I need to access this variable outside of $.post()
        console.log(response);
    }
}, "json");

Aktualisieren: Wenn die Antwortdaten global verfügbar sein sollen, können Sie die Variable im globalen Bereich wie folgt deklarieren:

var response = null;
$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        response = data_response;
        console.log(response);
    }
}, "json");

Natürlich ist das der einzige Kontext, in dem Sie sicher sein können, dassresponse wurde tatsächlich mit einem Wert gefüllt, der in der Callback-Funktion zur Verfügung gestellt wird$.post nach der linieresponse = data_response;. Wenn Sie es in einer anderen Phase des Skripts verwenden möchten, müssen Sie zuerst den Wert überprüfen. etwas wie das:

if (response !== null)
{
    console.log(response);
}

Beachten Sie nur, dass dieser Code nichts bewirkt, wenn Sie ihn direkt nach dem einfügen$.post Anruf; Dies ist nur dann sinnvoll, wenn es nach Abschluss der POST-Anforderung in einem anderen asynchronen Rückruf ausgeführt wird (möglicherweise in einem UI-Interaktionsereignis).

Gibt es keine Möglichkeit, diese Antwort global verfügbar zu machen? Alex
@ w0rldart: Sie können es einer Variablen mit globalem Gültigkeitsbereich zuweisen, aber Sie müssen vorsichtig sein, wenn es tatsächlich gefüllt ist. Siehe das Update. Will Vousden
0

Ich habe es so funktioniert:

var returnedData = {}; //Declaring Object var not just var
$.ajax({
type: 'POST',
url: 'do.php',
data: { OP: "news_search", category: cat_id },
success: function (response) {
returnedData.result1=response;  //Add response into the Object created outside the ajax
},
dataType: "json"
});
console.log(returnedData);//inside it you can get returnedData.result1
0

len müssen, dass dieser Wert direkt nach dem Aufruf von $ .post () angegeben wird, können Sie versuchen, den "POST" -Aufruf synchron auszuführen. Dies kann nicht mit $ .post () gemacht werden, kann aber mit $ .ajax () gemacht werden:

var returnedData = null;

$.ajax({
  type: 'POST',
  url: 'do.php', 
  data: { OP: "news_search", category: cat_id },
  success: function (response) {
            returnedData = response;
        },
  dataType: "text"
});

console.log(returnedData );
es geht nicht ... Alex
1

ne () suchen. Ist dies erledigt, wird sie sofort ausgeführt. Ist dies nicht der Fall, wird sie ausgeführt, sobald der Ajax-Aufruf erledigt ist.

var XHR = $.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        // do somehing with data_response
    }
}, "json");


function doSomethingElse() {
    XHR.done(function(response) {
        console.log(response);
    });
}

Verwandte Fragen