проблемы с асинхронными jquery и циклами - PullRequest
1 голос
/ 13 июня 2010

Я так растерялся. Я пытаюсь добавить порталы на страницу, просматривая массив и вызывая метод, который я написал, называется addModule (). Метод вызывается нужное количество раз (проверяется с помощью оператора оповещения) в правильном порядке, но фактически заполняется только один или два портала. Я чувствую, что что-то с циклом и асинхронностью, но это легче объяснить с помощью кода:

moduleList = [['weather','test'],['test']];</p> <p>for(i in moduleList) { $('#content').append(''); for(j in moduleList[i]) { addModule(i,moduleList[i][j]); //column,name } } </p> <p>function addModule(column,name) { alert('adding module ' + name); $.get('/modules/' + name.replace(' ','-') + '.php',function(data){ $('#'+column).append(data); }); }

для каждого массива в основном массиве я добавляю новый столбец, так как это то, чем является каждый подмассив - столбец порталов. Затем я перебираю этот подмассив и вызываю addModule для этого столбца и название этого модуля (который работает правильно). В моем методе addModule произошла ошибка: он добавляет только первый и последний модули, иногда средний, а иногда и вовсе нет ... я в замешательстве!

Ответы [ 2 ]

1 голос
/ 13 июня 2010

Вы уверены, что это не проблема с вашим PHP?

Он прекрасно работает для меня (используя альтернативные запросы http).

Протестируйте здесь: http://jsfiddle.net/kkxBH/1/ (обновлено)

Конечно, элементы, добавленные в один и тот же столбец, могут не добавляться в том же порядке, в котором они были отправлены.А точнее в том порядке, в котором получен ответ.Не обязательно то же самое.

РЕДАКТИРОВАТЬ: Обновлено для обеспечения правильного порядка.

moduleList = [['weather','test'],['test'],['some','other']];

request = ['http://www.microsoft.com',
           'http://www.apple.com',
           'http://www.google.com'];


for(i in moduleList) {
    for(j in moduleList[i]) {
        addModule(i,moduleList[i][j], j); //column,name, j index
    }
}

    // Receive "j" from inner for() loop
function addModule(column,name, j) {

         // Reference the column
    var $column = $('#'+column);

         // Append a new <span> tag to the column that has
         //   the value of "j" as the class name
    $('<span/>',{ className:j }).appendTo($column);

    $.get(request[column],function() {
           // Append the result to the proper span in the proper column.
           // (Of course, you'll be appending your data returned.)
        $column.find('span.' + j).append(name);
    });
}​
0 голосов
/ 13 июня 2010

@ Патрик, спасибо за предложение, но это не решает проблему. Это как-то связано с асинхронным вызовом, потому что, если я установлю асинхронное значение fase с использованием примитива $ .ajax вместо $ .get, мои порталы будут в правильном порядке :) Но использование синхронизации очень плохо и очень медленно, плюс сами модули полагаются на асинхронный код внутри ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...