2015-01-15 2 views
-1

Мне нужно вызвать 3 функции с запросами AJAX до того, как одна из функций будет готова. Для всех функций нужны одни и те же данные, поэтому я хочу запустить запрос AJAX только один раз. Я думаю, что мне нужна функциональность, чтобы вызывать 2 из 3 функций, чтобы ждать и предоставлять данные в конце. Может быть, проблема в том, что я новичок в jQuery Deferred и не нашел какой-то основной материал? Спасибо за помощь!jQuery deferrend; callback для функций ожидания

Поскольку мой сценарий является сложным, как, например, таким образом я создал эту демонстрацию (я надеюсь, что это говорит само за себя)

<script> 
    var requestRunning = false; 

    //do some ajax request etc... 
    function doSomething() { 
     return { 
      doIt: function (test, startDelay) { 
       var dfd = $.Deferred(); 

       setTimeout(function() { 
        if (requestRunning == false) { 
         console.log("starting ajax call:", test); 

         requestRunning = true; 

         //Fake ajax call 
         setTimeout(function() { 
          dfd.resolve(test); 
          // Todo: A done; provide data to waiting B and C. 
         }, 500); 
        } 
        else { 
         console.log("ajax call allready running, waiting...", test); 
        } 
       }, startDelay); 

       return dfd.promise(); 
      } 
     } 
    } 

    // Fake delay for function calls in really short time 
    var master = doSomething(); 
    var a = master.doIt("a", 10); 
    var b = master.doIt("b", 15); 
    var c = master.doIt("c", 12); 

    // Do some stuff with the received data... 
    a.done(function myfunction(result) { 
     console.log(result + " done"); 
    }); 

    b.done(function myfunction(result) { 
     console.log(result + " done"); 
    }); 

    c.done(function myfunction(result) { 
     console.log(result + " done"); 
    }); 
</script> 
+0

Похоже, что вы хотите выполнить последовательность a, b и c, но на 100% не ясно, какая должна быть последовательность. Например, у вас может быть «a тогда b, а затем c» или «a» (b и c параллельно) 'или' (a и b параллельно), затем c 'или' (a, b и c параллельно) then something_else '. Любое из них возможно. –

+0

Существует не определенный порядок для A, B и C. Иногда только A нуждается в данных; в противном случае все 3 нуждаются в данных. Но если более одной функции нужны данные, я хочу только запустить 1 ajax-вызов (данные результата для A/B/C одинаковы) – Chris

+0

Извините, я не понимаю. –

ответ

1

Я не совсем уверен, что вы пытаетесь сделать, но если то, что вы хочу сделать, это запустить три Ajax звонки сразу, а потом знать, когда все они сделаны, так как JQuery Ajax звонки уже вернуть обещание, вы можете использовать это обещание и $.when() вроде этого:

var p1 = $.ajax(...); 
var p2 = $.ajax(...); 
var p3 = $.ajax(...); 

$.when(p1, p2, p3).then(function(r1, r2, r3) { 
    // results of the three ajax calls in r1[0], r2[0] and r3[0] 
}); 

Или, вы даже можете сделать это без промежуточных переменных:

$.when(
    $.ajax(...), 
    $.ajax(...), 
    $.ajax(...) 
).then(function(r1, r2, r3) { 
    // results of the three ajax calls in r1[0], r2[0] and r3[0] 
}); 

Если вы вызываете функции, которые сами по себе Ajax звонки, то вы можете просто вернуть АЯКС обещание от этих функций и использовать вызов функции со структурой выше:

function doSomethingAjax() { 
    // some code 
    return $.ajax(...).then(...); 
} 

$.when(
    doSomethingAjax1(...), 
    doSomethingAjax2(...), 
    doSomethingAjax3(...) 
).then(function(r1, r2, r3) { 
    // results of the three ajax calls in r1[0], r2[0] and r3[0] 
}); 
+0

Да, я знаю, как подождать, если будет сделано еще несколько звонков AJAX. Но мне нужен только 1 вызов AJAX и результат для нескольких функций. Проблема в том, что я не могу запустить вызов AJAX и после успешного запуска функций. Функции должны запускать вызов AJAX, если вызов продолжается, а другая функция пытается снова запустить вызов, другая функция должна ждать результата выполнения AJAX-вызова. Мне нужен наблюдатель или что-то в этом роде? – Chris

+0

@Chris - javascript никогда не «ждет» выполнения асинхронных операций. Это просто не работает. Таким образом, вы никогда не сможете заставить свою функцию ждать завершения вызова ajax. Вместо этого вам нужно будет дать вашей функции асинхронный интерфейс с обратным вызовом и вызвать обратный вызов, когда функция будет выполнена. – jfriend00