2009-07-07 17 views
0

var query1 = urlencode($('input[name="searchTerm1"]').val()); //user1 
var query2 = urlencode($('input[name="searchTerm2"]').val()); //user1 
var rpp = 20; //number of tweets to retrieve out 
var c=0; 
var f1=new Array(); 
var f2=new Array(); 
var common=new Array(); 
$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query1 + '&callback=?', 
     function(data) { 
           f1=data; 

      $('#content').append('p'+f1[0]+'p');//this one is coming 
      }); 
$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query2 + '&callback=?', 
     function(data1) { 
            f2=data1; 
       }); 
$('#content').append('p'+f1[0]+'p');//this one is not coming...its showing Undefined 
}) 

In diesem Code, wenn u deutlich sehen, habe ich identifiziert mit // zwei Aussagen anhängenUmfang Variable in Javascript Problem

einer von ihnen arbeitet und die Nummer in der Reihe ausgibt

aber die ein anderer gibt Undefined aus

Ich habe die Arrays so definiert, dass sie die Werte annehmen sollten, aber wat tatsächlich passiert ist, dass das Array außerhalb der $ .getJSON-Funktion unzugänglich wird.

Jede Hilfe wird geschätzt.

Danke

Antwort

1

@anand, $ .getJSON() ruft JSON-Daten asynchron ab. Der Zweck der Callback-Funktionen besteht darin, die Arbeit auszuführen, sobald der JSON von der asynchronen Anforderung empfangen wurde. Ich werde Ihr Beispiel etwas vereinfachen:

var query1 = urlencode($('input[name="searchTerm1"]').val()); //user1 
var query2 = urlencode($('input[name="searchTerm2"]').val()); //user1 
var rpp = 20; //number of tweets to retrieve out 
var c=0; 
var f1=new Array(); 
var f2=new Array(); 
var common=new Array(); 

$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query1 + '&callback=?', 
    // 1st callback 
    function(data) { 
     f1=data; 

     // We know that f1 has been assigned, so unless the Twitter API 
     // returns an empty Array, f1[0] will not be Undefined. 
     $('#content').append('p'+f1[0]+'p');//this one is coming 
}); 
$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query2 + '&callback=?', 
    // 2nd callback 
    function(data1) { 
     f2=data1; 
}); 

// This statement may be executed before 1st callback and therefore 
// f1 may still be an empty Array causing f1[0] to return Undefined. 
$('#content').append('p'+f1[0]+'p');//this one is not coming...its showing Undefined 

Bitte überprüfen Sie die Kommentare zu Ihren Aufrufen an append(). Hoffe das hilft!

+0

so wat il do ist nach beiden Callback il ein Zeitrahmen, nach dem die 2. append wird ausgeführt werden, die gibt $ .getJSON reichlich Zeit, um alle Daten von url .. – anand

+2

@anand, ich würde kein Timeout gesetzt. Du fragst nur nach Problemen auf diese Weise. Sie können niemals die Antwortzeit für einen asynchronen Aufruf garantieren. Stattdessen könnten Sie den zweiten $ .getJSON-Aufruf im ersten Callback verschachteln. Wenn das nicht klar ist, lass es mich wissen. –

+0

Sie müssen einen Rückruf verwenden. Wenn Sie einfach eine Verzögerung ausführen, beginnt die Verzögerung nicht einmal, bis diese JavaScript-Routine trotzdem beendet wird (JavaScript ist single-threaded). Sie können es als Rückruf innerhalb eines Timeouts tun, aber wenn Sie das tun, warum benutzen Sie nicht einfach die Rückruffunktion von $ getJSON? – Nosredna

0

Sie benötigen Werte innerhalb der Callback-Funktion anzuhängen. Im Moment wird Ihre Codezeile nach den beiden $ .getJSON-Aufrufen ausgelöst, bevor der Download des JSON abgeschlossen ist. Deshalb funktioniert der erste Append. Sie haben ein Timing-Problem.

den Zeitpunkt zu veranschaulichen, verwenden Alarmmeldungen wie diese ...

$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query1 + '&callback=?', function(data) { 
    f1=data; 
    alert('Two'); 
    $('#content').append('p'+f1[0]+'p');//this one is coming     
}); 

$.getJSON('http://twitter.com/followers/ids.json?screen_name='+ query2 + '&callback=?', function(data1) { 
    f2=data1; 
    alert('Three'); 
}); 

alert('One'); 
$('#content').append('p'+f1[0]+'p');//this one is not coming...its showing Undefined 
+0

ach so muss ich beiden $ .getJSON Funktionen Zeit geben, bevor ich sie anhängen kann. also wie mache ich das? – anand

+0

Sie müssen die Callback-Struktur von jQuery verwenden. –

0

Sie nie f2 verweisen, so dass Sie ein copy/paste Fehler haben kann. Wolltest du nochmal auf f1 verweisen?

By the way, ist es besser, die Arrays wie diese

var f1=[]; 
var f2=[]; 
var common=[]; 

eher zu initialisieren als "new Array" verwendet wird.

Auch, wie Josh betonte, sind Ajax-Aufrufe asynchron. Sie möchten sich nicht darauf verlassen, dass die Daten eingehen, bis sie ankommt.

BEIDE von Ihren $ getJSON-Aufrufen werden sofort zurückkommen, so dass Ihr Programmfluss nicht das ist, was Sie zu erwarten scheinen.

jQuery's $getJSON nimmt als dritten Parameter eine Callback-Funktion an. Sie möchten eine nach dem Anruf für die Verarbeitung einrichten.

Wenn Sie mit Ajax programmieren, haben Sie kein großes Stück JavaScript, Sie haben eine Menge ereignisgesteuerter Code.

+0

Das * ist * wie er initialisiert. Ich denke du meinst [] –

+0

Ja. Ich wollte das zu [] bearbeiten. – Nosredna

+0

Sie verstehen die Frage nicht. das erste Append funktioniert, weil es innerhalb des $ .getJSON ist, aber das andere Append ist nicht da es außerhalb der $ .getJSON-Funktion ist. warum passiert das und ich meinte, f1 wieder zu verursachen, es ist ein Testcode. – anand