2016-05-28 2 views
0

После преобразования массива имен в массив ссылок URL для пользователей онлайн и офлайн и только имена закрытых учетных записей ["https://link_1","https://link_2",name(for closed account),"https//link_3",...] через метод $ .map и .getJSON внутри этого.

Я пытаюсь применить метод $ .each с условием внутри снова, поэтому, если элемент начинается с «http», я применил метод .getJSON для работы с объектом JSON элемента (link) и добавить к нему html значения их свойств (например, html + = json.name); если элемент не начинается с «http», добавьте только значение элемента (например, html + = значение). Это не работает; переменная html принимает индекс и значение внутри jQuery.each, но не объект json вложенного метода .getJSON. Где я проиграл?

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

догадка вы пытаетесь использовать 'html' перед тем Аякса делается. Важно понимать, что ajax является асинхронным. На самом деле неясно, какова конкретная проблема, хотя ... внутри 'each' или используя данные – charlietfl

+0

Просто не можете найти, в чем проблема! Я думаю, что ваш код может работать корректно, за исключением последовательности значения «html» –

ответ

0

Ваши запросы JSON будет возвращать асинхронно, так что если вы проверить значение html прямо под кодом предоставленной вами, ни один из этих запросов JSON не будут возвращены, поэтому соответствующие ответные данные будут отсутствовать в html.

Вместо этого вам необходимо использовать функцию обратного вызова запроса JSON, чтобы отслеживать, сколько ответов вы получили, и когда у вас есть все, только тогда сделайте что-нибудь с html.

Вот некоторые предлагаемые код:

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

Да, он полностью работает. Большое спасибо. То, что я не вижу, - это то, почему нам нужно условие для count == 0 в коде .getJSON, если мы поместим одно и то же условие во внешнем pat кода чуть ниже подсчета переменных. В общем, мне нужно было бы немного просветить о javascript асинхронном. Кто-то знает какой-то ресурс, освещающий этот момент. – user1881983

+0

Условие должно быть в обоих местах. В конце функции необходимо закрыть случай, когда вы вообще не выполняете никаких вызовов JSON. Поэтому, чтобы убедиться, что в этом случае вызывается обратный вызов 'ready', он должен быть добавлен в конце функции. В обратных вызовах JSON это необходимо для всех случаев, когда у вас есть хотя бы одна запись «http», поскольку для тех, у кого вы будете иметь значение позже, асинхронно, и только тогда вы можете проверить, есть ли у вас ответ на каждый элемент массива. – trincot

+0

Если бы это ответили на ваш вопрос, не могли бы вы пометить его как принятый? (серая галочка слева от ответа). Благодарю. – trincot

Смежные вопросы