jquery, как сделать что-то после $ .deferred ()?

0

Я совершенно уверен, что я прошу просто и понятно, но и я устал и не вижу этого :(

Мой упрощенный пример:

function doSomething(){
   doFirst();
   doSecond();
}

function doFirst(){
   $.when(
      //doing an ajax call and getting a result
   )
   .then(
      function(result){
         // doing something with the result
         $(document).append('<div id="first">I am first</div>');
      }
   );
}

function doSecond(){
   $('#first').css({'color':'#900'});
}

doSomething();

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

  • 1
    # префикс для выбора идентификатора . префикс для выбора класса.
  • 0
    О боже ... да, спасибо, но это не проблема в любом случае.
Показать ещё 1 комментарий
Теги:
jquery-deferred

2 ответа

1
Лучший ответ

Вы можете doFirst() обещание, вернув обещание от doFirst():

function doFirst(){
  /* return the '$.when' promise*/
  return $.when(
      //doing an ajax call and getting a result
   )
   .then(function(result){
         // doing something with the result
         $(document).append('<div class="first">I am first</div>');
      }
   );
}

function doSomething(){
   doFirst().then(function(){
         doSecond();
   });  
}

DEMO

Будет также получить тот же результат, просто вернув ajax без $.when поскольку $.ajax возвращает обещание

function doFirst() {
    /* return the ajax promise*/
    return $.post('/echo/html/', {
        html: '<div id="first">I am first</div>'
    }).then(function (result) {        
        $('body').html(result);
    });
}

DEMO 2

  • 0
    Спасибо за предложение. Я изменил ajax в вашей скрипке с HTML на JSON, и он больше не работает. Вилка:
  • 1
    нет элемента id= first в вашей демоверсии .... jsfiddle.net/xypLg/1
Показать ещё 1 комментарий
1
function doSomething() {
    //pass a callback to doFirst which will get executed once the ajax request is completed
    doFirst(function () {
        doSecond();
    });
}

function doFirst(callback) {
    $.when(
    //doing an ajax call and getting a result
    ).then(function (result) {
        // doing something with the result
        $(document).append('<div class="first">I am first</div>');
        callback();
    });
}

function doSecond() {
    $('#first').css({
        'color': '#900'
    });
}

doSomething();
  • 0
    Спасибо за помощь. так как оба ответа по сути одинаковы, я принял приведенный выше просто потому, что он был более подробным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню