2010-02-15 62 views
1

好吧,我需要發送一個大的請求到運行ASP :: PERL的服務器,並讓服務器發回到調用頁面。基本上 - >告訴服務器將一大堆文件上傳到文件共享中,然後在每個文件檢查錯誤/上傳/成功或失敗時更新客戶端上的div。jQuery的ASP反向回調頁面

有沒有把一些回調函數在後端ASP頁面調用客戶方的加載頁面的JavaScript函數的方法嗎?這必須在服務器上循環工作,所以基本上是從服務器到客戶端的pingback,因爲每個文件都被上傳,直到所有文件被檢查/上傳。

+1

這是一個有趣的話題。我個人會通過讓客戶端輪詢服務器來解決這個問題,服務器定期更新一些狀態表(或其他)。但我會看看別人有什麼要說的。 – Pointy 2010-02-15 15:31:21

+0

Ooo ...我想知道是否可以將最初的「POST」目標設爲隱藏的iframe,然後服務器將會發送一系列「腳本」塊。每個腳本塊都是完整的,並且只包含一個函數調用,以便更新狀態的父頁面中的某些內容。也許瀏覽器會解析並執行腳本標記,即使整個頁面尚未完成。 – Pointy 2010-02-15 15:33:34

+0

是的,什麼尖的說..... – 2010-02-15 15:33:39

回答

0

你可能從這個post得到一些里程。話題是大量的電子郵件,但該戰略將針對您的要求工作..

+0

好吧,我以前的想法和測試是一個nogo,讓我試試這個。感謝Sky的代碼 - 我將會對它進行測試,看看它是否能解決我的問題。當然,現在我需要在PERL中編寫Web服務 - 但那是另一個問題。 – 2010-02-15 21:19:31

2

像上面的評論說,(我敢肯定),你有投票要做到這一點。

當您將文件發送到服務器,使用setTimeout()函數註冊一個回調函數。這個函數將「輪詢」服務器,詢問操作的狀態(有多少文件......完成了多少%)。如果操作沒有完成,只需在函數完成之前重新註冊相同的函數 - 再次使用setTimeout()。

var callback = function() { 
    // (1) Use ajax to get status from the server 
    // (2) Update the progress div 
    // (3) If complete, signal the user and hide the progress bar; otherwise register callback() again 
} 

var submitFiles = function() { 
    // Send files to server 
    setTimeout(callback, 1000); 
} 
+0

我不認爲投票會對我不利。我列出客戶端頁面上的每個文件,並且用戶想知道每個文件的狀態,而不僅僅是整個事務的狀態。但是我不能發送每個文件並且傳統地處理,因爲我將在一個充滿圖紙的大目錄中擊敗服務器而死亡。這是一個破解這個問題的堅強後盾。 – 2010-02-15 15:55:04

0

感謝您的所有幫助人員。我想出瞭如何去做我們需要的。它歸結爲的是我們想要拖延每個文件的調用,這樣我們就不會用一大堆文件上傳調用壓倒我們的後端服務器。因此,我們選擇了基本上進行異步調用的遞歸策略,然後等待成功回調並處理結果 - 然後再次調用該方法。這裏是一些代碼:

function doAjaxCall(targetCheckBox) 
{ 
    if ((targetCheckBox) == 'undefined' || targetCheckBox == null) 
    { 
     targetCheckBox = $('#toprint input:checkbox[id*=ChkIn]:checked:first'); 

     if ($(targetCheckBox).length == 0) 
     { 
      alert('All Files Processed!'); 
      if (!CheckForm()){ 
       $('#checkinbtn').remove(); 
      } else 
      { 
       $('#checkinbtn').removeAttr('disabled'); 
       $('#checkinbtn').val('Check In'); 
      } 
      return; 
     } 
    } 

    var res = $(targetCheckBox).val().split("/"); 
    var targetID = res[res.length-1]; 
    var test = document.getElementById('comment_'+targetID); 
    var commentField = $(test); 
    $.ajax({ 
     type: "POST", 
     url: "loadfiles.asp", 
     data: getPostString($(targetCheckBox).val()), 
     success: function(result) { 
      if (result.indexOf('Error')> -1){ 
       commentField.attr('style', 'background-color:#FF6267'); 
      } else { 
       commentField.attr('style', 'background-color:#88CC55'); 
      } 
      commentField.empty(); 
      commentField.html(result); 
      $(targetCheckBox).remove(); 
      doAjaxCall(null); // recurse on success until we don't have any more files 
     } 
    }); 
    $("#fileCounter").remove(); 
}