2016-05-28 7 views
0

Nach dem Konvertieren eines Arrays von Namen in einem Array von URL-Links für Benutzer online und offline und nur Namen für geschlossene Konten ["https://link_1","https://link_2",name(for closed account),"https//link_3",...] durch die $ .map-Methode und die .getJSON innerhalb dessen.

Ich versuche, die $ .each-Methode mit einer Bedingung innerhalb wieder anzuwenden, also wenn das Element mit "http" beginnt, habe ich .getJSON Methode angewendet, um mit dem JSON-Objekt des Elements (Link) zu arbeiten und summieren html die Werte ihrer Eigenschaften (zB html + = json.name); Wenn das Element nicht mit "http" beginnt, addiere nur den Wert des Elements (z. B. html + = Wert). Es funktioniert nicht; Die html-Variable übernimmt index und value innerhalb von jQuery.each, nicht jedoch das json-Objekt der verschachtelten .getJSON-Methode. Wo ich verloren habe?

channels=["https://link1","https://link2","name(for closed account)",....]; 
var html=""; 
$.each(channels,function(index,value){ 

    // for elements that are links 
    if(value.substring(0,4)=="http"){ 

     $.getJSON(value,function(json){ 
      html+=json.name; 
     }); 
    } 
     // for elements that are not links 
    else { 
     html+= value; 
    } 
}); 
+0

beste Vermutung ist, Sie versuchen, 'html' zu verwenden, bevor Ajax getan. Wichtig zu erkennen, dass Ajax asynchron ist. Wirklich nicht klar, was ein bestimmtes Problem ist ... innerhalb der 'each' oder mit den Daten – charlietfl

+0

Kann einfach nicht finden, was das Problem ist! Ich denke, dass Ihr Code ordnungsgemäß ausgeführt werden kann, außer der Reihenfolge des Werts von "html" –

Antwort

0

Ihre JSON Anfragen werden asynchron zurückkehren, wenn Sie also den Wert von html direkt unter dem Code testen Sie zur Verfügung gestellt, keine dieser JSON-Anfragen zurückgegeben hat, so dass die entsprechenden Antwortdaten in html fehlen werden.

Stattdessen müssen Sie die Callback-Funktion der JSON-Anfrage verwenden, um zu verfolgen, wie viele Antworten Sie erhalten haben, und wenn Sie alle haben, nur dann tun Sie etwas mit html.

Hier sind einige vorgeschlagen Code:

function buildHtml(channels, ready) { 
    // Use an array, so you can store each response in the corresponding slot 
    var html = []; 
    // Keep a count of the replies you still need 
    var count = channels.length; 
    $.each(channels,function(index, value){ 
     // for elements that are links 
     if(value.substring(0,4)=="http"){ 
      $.getJSON(value,function(json){ 
       html[index] = json.name; 
       count--; 
       if (count == 0) { 
        // All is done, notify the caller: 
        if (ready) ready(html.join('')); 
       } 
      }); 
     } 
      // for elements that are not links 
     else { 
      html[index] = value; 
      count--; 
     } 
    }); 
    if (count == 0) { // Only true if there were no http entries: 
     // All is done, notify the caller: 
     if (ready) ready(html.join('')); 
    } 
} 

channels=["https://link1","https://link2","name(for closed account)",....]; 
// Provide a call back function that is called when html is complete: 
buildHtml(channels, function (html) { 
    console.log('The returned HTML is: ' + html); 
}); 
+0

Ja, es funktioniert vollständig. Danke vielmals. Was ich nicht sehen kann, ist, warum wir eine Bedingung für count == 0 innerhalb des .getJSON-Codes benötigen, wenn wir dieselbe Bedingung in den äußeren Teil des Codes genau unterhalb der Variablenanzahl schreiben. Im Allgemeinen würde ich etwas mehr Aufklärung über Javascript asynchron benötigen. Jemand kennt eine Ressource, die diesen Punkt hervorhebt. – user1881983

+0

Der Zustand ist an beiden Orten erforderlich. Am Ende der Funktion müssen Sie den Fall abdecken, in dem Sie überhaupt keine JSON-Aufrufe durchführen. Um sicherzustellen, dass der 'ready'-Callback in diesem Fall aufgerufen wird, muss er am Ende der Funktion hinzugefügt werden. In den JSON-Callbacks ist es für alle Fälle notwendig, in denen Sie mindestens einen "http" -Eintrag haben, da Sie den Wert erst zu einem späteren Zeitpunkt (asynchron) haben und erst dann prüfen können, ob Sie auf jede Antwort eine Antwort haben Array-Element. – trincot

+0

Wenn dies Ihre Frage beantwortet, können Sie es bitte als akzeptiert markieren? (graues Häkchen links neben der Antwort). Vielen Dank. – trincot