2015-01-15 116 views
-1

在完成其中一個函數之前,我必須使用AJAX請求調用3個函數。所有函數都需要相同的數據,所以我只想啓動一次AJAX請求。我認爲我需要一個功能來調用3個函數中的2個來等待並提供數據。也許問題是我是新來的jQuery延遲,並沒有找到一些基本的東西?感謝幫助!jQuery deferrend;等待函數的回調

因爲我的劇本是複雜的例子,所以我創造了這個演示:(我希望它是自我解釋)

<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 then(b和c並行)'或'(a和b並行)然後c'或者'(a,b和c並行)然後something_else '。任何這些都是可能的。 – 2015-01-16 06:41:35

+0

A,B和C沒有定義的順序。有時只有A需要數據;其他時間都需要這些數據。但是如果多於一個功能需要這些數據,我只想開始1個Ajax調用(A/B/C的結果數據是相同的) – Chris 2015-01-16 08:48:28

+0

對不起,我不明白。 – 2015-01-16 17:25:52

回答

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調用的功能,那麼你可以只歸還從這些職能的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 2015-01-16 08:41:35

+0

@Chris - javascript不會「等待」異步操作。它只是不這樣工作。所以,你不能等到ajax調用完成時才讓你的函數等待。相反,你必須給你的函數一個帶有回調的異步接口,並且該函數完成後可以調用該回調函數。 – jfriend00 2015-01-16 14:59:04