2010-12-09 5 views
2

я застрял со следующей проблемой:функция выполняется слишком рано

Я хочу функцию, чтобы создать DIV тег для хранения изображений и второй функцией для создания тега IMG и вставить их в DIVs, созданный ранее. Хорошо работает с «предупреждающими сообщениями». Однако без предупреждений вторая функция запускается до первой законченной загрузки тегов DIV.

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

Вот код:

function imageLoader() 
    {   
    for (i=1;i<=5;i++) 
      { 
      checkPath = 'images/pic'i+'.png'; 
      $.ajax({ 
        url: checkPath, 
        type:'HEAD', 
        success: 
          function() { 
            //create DIVs t hold images 
            $('.tools').append("<div class='tooling'></div>"); 
            } 
        }); 
      } 
    // after creating DIVs, call function to create <img> tags 
    appendix(); 
    } 

Спасибо за помощь.

С уважением,

частые

ответ

2

Поскольку, как Кос отметил, вы не можете полагаться на звонки для завершения того, вы будете иметь, чтобы получить немного сложнее, чтобы гарантировать, что все ваши Аякса вызовы были завершены , Попробуйте что-то вроде этого:

function imageLoader() { 
    var ajaxCounter = 0; 
    for (i = 1; i <= 5; i++) { 
     checkPath = 'images/pic' 
     i + '.png'; 
     $.ajax({ 
      url: checkPath, 
      type: 'HEAD', 
      success: function() { 
       //create DIVs t hold images 
       $('.tools').append("<div class='tooling'></div>"); 
       ajaxCounter++; 
       if (ajaxCounter == 5) { 
        // after creating DIVs, call function to create <img> tags 
        appendix(); 
       } 
      } 
     }); 
    } 
} 

Это должно проверить, чтобы убедиться, что у вас есть необходимое количество АЯКС успехов перед выполнением appendix() вызова.

+0

Спасибо. Я думаю, что это то, что я искал, хотя, если img нет, я застрял, не так ли? – frequent 2010-12-09 17:34:03

+0

Да, я полагаю.Вы можете обойти это, возвращая что-то еще в том случае, если изображение не найдено или не устанавливает тайм-аут и не выполняет функцию, когда время истекает, если оно еще не было вызвано. – Ender 2010-12-09 17:37:46

0

Вы можете установить асинхронной ложь в $ .ajax так исполнение блоков. Или вы можете проверить i в обратном вызове с успешным выполнением, а если его 5, призовите приложение().

+0

+1 для первого, -1 для последнего, как Ajax звонки не гарантируется, чтобы закончить в порядке .... право ? – Kos 2010-12-09 17:11:47

2

Я не могу точно сказать, что вы спрашиваете, но похоже, что вам нужно переместить звонок appendix() в обратный вызов успеха. Помните, что вызов success не может быть выполнен до вызова appendix в представленном вами коде.

function() { 
    //create DIVs t hold images 
    $('.tools').append("<div class='tooling'></div>"); 
    appendix(); 
} 

Конечно, вы можете не захотеть этого 5 раз в вашем цикле for. Вот один из способов сделать это позвонить после того, как происходит последний успех, возможно, не самый чистый:

for (i=1;i<=5;i++) 
{ 
    if(i == 5) { 
    var succ = function() { 
     //create DIVs t hold images 
     $('.tools').append("<div class='tooling'></div>"); 
     appendix(); 
     }; 
    } else { 
    var succ = function() { 
     //create DIVs t hold images 
     $('.tools').append("<div class='tooling'></div>"); 
     }; 
    } 
    checkPath = 'images/pic'i+'.png'; 
    $.ajax({ 
    url: checkPath, 
    type:'HEAD', 
    success: succ 
    }); 
} 
+0

У меня было приложение(); «внутри» успеха раньше, но затем функция была вызвана 5 раз, поэтому я переместил ее за пределы цикла. Я думаю, ваше предлагаемое решение в значительной степени то, что я пытался сделать. БЛАГОДАРЯ! – frequent 2010-12-09 17:32:12

1

а) Создайте переменную для подсчета, сколько раз success функция обратного вызова выполняется и запустить appendix только тогда, когда это число равняется номер ваших вызовов ajax,

b) Зарегистрируйте ответный вызов $.ajaxComplete.

0
function imageLoader() 
{   
for (i=1;i<=5;i++) 
     { 
     checkPath = 'images/pic'i+'.png'; 
     $.ajax({ 
       url: checkPath, 
       type:'HEAD', 
       success: 
         function() { 
           //create DIVs t hold images 
           $('.tools').append("<div class='tooling'></div>", 
            function(){ 
             appendix(); 
            }); 
           } 
       }); 
     }  
} 
1

элегантный способ сделать это состоит в использовании $.when:

function imageLoader(
    $.when.apply($, $.map(new Array(5), function (e, i) { 
     var checkPath = 'images/pic' + (i + 1) +'.png', 
      d = $.Deferred(); 

     $.ajax({ 
      url: checkPath, 
      type:'HEAD', 
      success: function() { 
       d.resolve($('<div class="tooling">') 
           .append($('<img>').attr(src, checkPath))); 
      }, 
      error: function() { d.resolve(null); } 
     }); 

     return d.promise(); 
    }) 
    .then(function() { 
     $('.tools').append(Array.prototype.slice(arguments)); 
    }); 
} 
Смежные вопросы