2017-02-24 49 views
-1

我正在使用C#和jQuery來構建表單頁面,並且我有多個輸入,如果它們被填充我想提交一個AJAX調用到附加的SQL服務器,如果他們沒有填充我想什麼都不做。 一旦所有填寫完成的AJAX調用完成,我想重新加載頁面。多個AJAX調用可能會也可能不會被調用,然後執行功能

現在我有這樣的功能:

Func1() 
{ 
    if ($'#form1').val().length > 0 { 
    $.post('https://foo/', {id: id, column: col1, value: $('form1').val()) 
    } 

    if ($'#form2').val().length > 0 { 
    $.post('https://foo/', {id: id, column: col1, value: $('form2').val()) 
    } 
} 

$('#submit').click(function() { 
    Func1(); 
    window.location.reload(true); 
}); 

然而,這導致被更新了一些值,但不是全部,我知道有我的異步調用的事情。我對異步調用相當陌生,但通常我會放一個.then(function(){});在他們的最後,他們工作正常,但在這種情況下,它不能解決任何問題。有人能指出我正確的資源方向來解決這個問題嗎?我無法嵌套我的AJAX調用,因爲有時2會更新,1不會。

+0

爲什麼'C#'和'剃鬚刀'標籤?我想你在你的項目中使用它們,但他們似乎沒有任何關係。無論如何,如果你想在所有的Ajax調用完成後重新加載頁面,你可以使用'Promise.all()'來等待它們。 – nnnnnn

+0

@nnnnnn是的,我正在使用他們兩個爲我的項目。對不起,如果他們不相關,我不確定。你能給我更多關於如何使用Promise.all()的上下文嗎? – Birdd

+0

是的,它是因爲ajax是異步的,並且在ajax調用完成之前調用'location.reload()'。但是,ajax的全部目的是保持在同一頁面上,並且在ajax調用完全沒有意義(並且正在降低性能)之後使用'location.reload()' –

回答

1

根據您的需求,您可以通過程序的輕微REORG acheive它:

function form1CallAsync(){ 
     var d = $.Deferred(); 
     if ($'#form1').val().length > 0) { 
     // Ajax call for Form1 post. Important: In the success callback, have  
     //d.resolve() in the end, in the error callback, d.reject() 
     } else { d.resolve(); } 
     return d.promise(); 
    } 
    function form2CallAsync(){ 
     var d = $.Deferred(); 
     if ($'#form2').val().length > 0) { 
     // Ajax call for Form2 post. Important: In the success callback, have  
     //d.resolve() in the end, in the error callback, d.reject() 
     } else { d.resolve(); } 
     return d.promise(); 
    } 
    $('#submit').click(function() { 
      $.when(form1CallAsync(), form2CallAsync()).done(
        function(a1, a2){ 
         // your code to process the results from both ajax posts 
         // .. 
         window.location.reload(true); 
        } 
      ) 
    }); 
+0

這是完美的,謝謝!我會嘗試一下,然後將其標記爲答案。 – Birdd

+0

這很好,你只需要在帶有構造函數括號的時候調用函數$。 – Birdd

+0

您還需要解析每個函數的else語句中的延遲 – Birdd

0

我可以想出一個解決方案。可能有更好的解決方案。

1)用false聲明兩個布爾變量。

2)一旦該特定的呼叫成功/失敗,就將每個變量設置爲真。

3)將窗口重新加載到文檔就緒,並相應地重新加載。

$(document).ready(function(){  
    if (callOne == true && calltwo == true){ 
window.location.reload(true); 
}  
} 
0

看一看優雅jQuery When

以上使用,可以重寫你的代碼爲:

$('#submit').click(function() { 
    if (($'#form1').val().length > 0 && ($'#form2').val().length > 0) { 
     $.when($.post(*form1Call*), $.post(*form2Call*)).done(
       function(a1, a2){ 
        // your code to process the results from both ajax posts 
        // .. 
        window.location.reload(true); 
       } 
     ) 
    }  
}); 
+0

除非我誤解,否則, t解決我的問題,如果form2被填寫,但form1不是,它永遠不會提交form2的更新。 – Birdd