2009-08-12 10 views
0

Wenn das Formular übergeben wird, rufe ich eine Funktion getPosts und durch eine Variable str übergeben. Ich möchte die von dieser Funktion zurückgegebenen Daten abrufen.Access-Array von einer Funktion zurückgegeben - javascript/jquery noob Moment

// when the form is submitted 
$('form#getSome').submit(function(){ 
    var str = $("form#getSome").serialize(); 
    var something = getPosts(str); 

    * This is where I'd like to get the data returned from getPosts() 

    return false; 
}); 

// get the data 
    function getPosts(str){ 

     $.getJSON('http://myurl.com/json?'+str+'&callback=?', 
      function(data) { 

      arrPosts = new Array(); 

       $.each(data.posts, function(i,posts){ 

       // build array here 

       }); 

       return arrPosts; 

      }); 
    }; 

Ich habe viele Dinge ausprobiert, habe aber nur 'undefined' zurückgegeben. Ich habe versucht, console.log (etwas); console.log (getPosts).

Ich vermisse etwas sehr fundamentales hier. Jede Hilfe würde sehr geschätzt werden.

EDIT:

Was ich versuche eine einzige Funktion zu tun ist, erstellen, die Beiträge erhalten würde. Dann würden verschiedene Ereignisse diese Funktion aufrufen. Ich könnte dann diese Daten verwenden. So kann ein Ereignis ein Formular senden, ein anderes kann auf einen Link klicken, ein anderes faules/endloses Scrollen. Alle können dieselbe getPosts-Funktion verwenden.

Es gibt eine Menge der Analyse der Ergebnisse, die zu vielen Codezeilen führt. Ich habe nur versucht, einen Weg zu finden, diese Funktion wiederzuverwenden. Denkst du, dass das möglich wäre?

$('a.thisLink').click(function(){ 
    getPosts(); 
    get the return from getPosts() and do something with it 
}); 

$('form.thisForm').submit(function(){ 
    getPosts(); 
    get the return from getPosts() and do something with it 
}); 

function getPosts(){ 
    get the posts and return an array 
} 

Antwort

4

Ajax-Anfragen asynchron ausgeführt werden, die Callback-Funktion (function (data)) von getJSON wird ausgeführt, wenn Die Anforderung endet, und die Rückgabe eines Werts in diesem Rückruf hat keine Auswirkungen, da es sich um eine verschachtelte Funktion in getPosts handelt und der Rückgabewert nie verwendet wird.

In Ihrem Beispiel gibt getPosts nichts zurück und es beendet die Ausführung vor die Daten zurückgegeben werden.

Ich würde Ihnen empfehlen, auf dem arbeiten Event-Handler einreichen, wenn Sie die getPosts Funktion behalten möchten, können Sie einen Rückruf Parameter vorstellen:

$('form#getSome').submit(function(){ 
    var str = $("form#getSome").serialize(); 

    getPosts(str, function (data) { 
    var array = []; 
    $.each(data.posts, function(i,posts){ 
     // build array here 
     array.push(/* value to add */); 
    }); 
    // array ready to work with... 
    //... 
    }); 
    return false; 
}); 

function getPosts(str, callback){ 
    $.getJSON('http://myurl.com/json?'+str+'&callback=?', callback); 
} 

Edit 2: Als Reaktion auf Mit Ihrem zweiten Kommentar können Sie einen weiteren Rückruf durchführen, der ausgeführt wird, wenn die Daten vom ersten Rückruf verarbeitet wurden, und Sie können ihn beim Ausführen der Funktion getPosts für den Ereignishandler submit definieren:

$('form#getSome').submit(function(){ 
    var str = $("form#getSome").serialize(); 

    getPosts(str, reusableCallback, function (result) { 
    // result contains the returned value of 'reusableCallback' <--- 
    }); 
    return false; 
}); 

function reusableCallback(data) { 
    var array = []; 
    $.each(data.posts, function(i,posts){ 
    array.push(/* value to add */); 
    }); 
    //... 
    return array; 
} 

function getPosts(str, callback, finishCallback){ 
    $.getJSON('http://myurl.com/json?'+str+'&callback=?', function (data) { 
    finishCallback(callback(data)); // pass the returned value 
            // of callback, to 'finishCallback' which is 
            // anonymously defined on the submit handler 
    }); 
} 

Bearbeiten 3: Ich denke, dass die getPosts Funktion und die „reusableCallback“ -Funktion sind stark verwandt, könnte man ihnen anschließen möchten, und der Code leichter zu bedienen und verstehen:

$('form#getSome').submit(function(){ 
    var str = $("form#getSome").serialize(); 

    getPosts(str, function (result) { 
    // result contains the processed results 
    }); 

    return false; 
}); 


function getPosts(str, finishCallback){ 
    $.getJSON('http://myurl.com/json?'+str+'&callback=?', function (data) { 
    // process the results here 
    var array = []; 
    $.each(data.posts, function(i,posts){ 
     array.push(/* value to add */); 
    }); 
    //... 
    finishCallback(array); // when the array is ready, execute the callback 
    }); 
} 
+0

Ich denke, das ist auf dem richtigen Weg. Ich habe versucht, eine einzige Funktion zu erstellen, die Beiträge erhalten würde. Und dann würden verschiedene Ereignisse Beiträge erhalten. So kann ein Ereignis ein Formular senden, ein anderes kann auf einen Link klicken, ein anderes lässiges Scrollen. Alle können dieselbe getPosts-Funktion verwenden.Es wird viel analysiert, was zu vielen Codezeilen führt. Ich habe nur versucht, einen Weg zu finden, das wiederzuverwenden. Denkst du, dass das möglich wäre? – jyoseph

+0

Ja genau das ist, was ich suche, auf diese Weise kann ich die wiederverwendbare Callback-Funktion wiederverwenden. Letzte Frage, wie referenziere ich die Daten, die zurückgegeben werden (von wiederverwendbarenCallback-Funktion) innerhalb der Submit-Funktion? – jyoseph

+0

@jyoseph: Schau meine zweite Bearbeitung ... – CMS

0

Ihre getPosts Funktion sieht unvollständig, ich bin kein Experte, aber jquery sollte es ungefähr so ​​aussehen:

function getPosts(str) { 

    $.getJSON('http://myexample.com/json?'+str+'&callback=?',function(data){ 

    var arrPosts = []; 

    $.each(data.posts, function(i,posts){ 
    ... build array yada yada ... 
    }); 

    return arrPosts; 

    }); 
} 
0

Das Problem ist, dass die $ .getJSON Callback-Funktion aufgerufen wird, wenn die Get-Anfrage die Daten zurückgibt, nicht inline mit Ihrer Funktion.

Verwandte Themen