2017-10-20 78 views
0

我想在屏幕/頁面/視圖上顯示進度,就像在控制檯中發生的一樣。所以,當我點擊安裝按鈕,我的「文本區域」控制應該開始像asp.net mvc -view顯示實時進度狀態

連接到數據庫 連接成功 行書a.sql 行書b.sql 操作完成 連接顯示進度關閉

  1. textarea是否是用於此目的的正確控件?
  2. 它似乎會有太多的從服務器到客戶端的旅行,只是爲了在屏幕上寫下進度我怎麼能最小化它?

回答

1

對此的一般方法是每秒發送一個ajax請求,並要求從服務器進行更新。

<div> 
    <pre id="status"> 
    </pre> 
</div> 

setInterval(function() { 
    $.ajax("/getUpdate?someParam=1234").then(function (result) { 
     // result is whatever JSON object you send from the server 
     $("#status").innerText = result.someProp; 
    }); 
}, 1000); 

它可能看起來像上面那樣。請注意,它每秒都會執行一次請求,並將來自服務器的消息存儲在pre元素中。

2

爲了能夠輕鬆做到這一點,您可以使用SignalR,根據瀏覽器版本選擇最佳通信協議(WebSocket,LongPolling..etc),簡化所用基礎技術的所有麻煩。 。

SignalR之後,其中一個底層使用的技術是websockets,除了在服務器和客戶端之間保持一個開放的全雙工通道,它不會發送任何內容,以防服務器中的任何更新將此更新推送給客戶端。最受歡迎的網站使用websockets來保持服務器和客戶端之間的開放通道。

SignalR實際上使用websockets,但是它會降級爲使用長輪詢,例如舊的瀏覽器不支持websocket的連接升級。

如果您確信客戶使用新瀏覽器,您可以選擇直接使用websockets。

最後一件事Stackoverflow作爲一個大而重的加載站點,一旦出現新的答案或評論,就會使用websocket進行更新。

+0

對於單個狀態頁面,這通常是矯枉過正。如果你有一個需要不斷收到消息的SPA,那麼我也會推薦SignalR,但是如果你只有短暫的頁面,signalr會帶來很多開銷。 – caesay

+0

底層技術是websockets,它除了在服務器和客戶端之間保持一個開放的全雙工通道外,不會發送任何內容,如果服務器中有任何更新,它會將此更新推送給客戶端。最受歡迎的網站使用websockets來保持服務器和客戶端之間的開放通道。 – msoliman

+0

SignalR實際上使用websockets,但是它會降級以對不支持webscoket連接升級的舊瀏覽器進行長輪詢。作爲一個大而沉重的網站stackoverflow使用websockets更新有一個新的答案或評論。 – msoliman