這真的不清楚你要解決什麼問題。爲客戶端編寫一堆http請求,然後按發送順序處理它們(不管接收到響應的順序如何),這非常簡單。如果您同時發送多個請求,那麼任何承諾驅動的ajax調用(如jQuery)和Promise.all()
的簡單組合都可以爲您做到這一點。
如果你沒有在同一時間發送它們,這樣就可以發送一個請求,稍後發送另一個請求(但之前之前的響應是回),然後發送一些請求,等等,然後你可以創建一個響應隊列。每個Ajax調用都綁定到一個隊列條目。當響應返回時,響應進入隊列條目。每次獲得響應時,您都會處理隊列中最早的響應的項目,並按隊列順序處理它們。這允許你做隨機發送時間請求,但總是按順序處理響應。由於所有這些順序都是在客戶端完成的,因此它不是防篡改(客戶端沒有任何防篡改功能),但它需要實際修改Javascript或隊列數據結構,而不僅僅是修改響應爲了改變處理的順序。爲了使事情更具防篡改性,您必須將更多決策權移交給服務器,以防止其被篡改。
這裏有一個簡單的基於承諾的Ajax隊列,讓你想發送儘可能多的請求,並保證了響應將按順序進行處理。
var queueAjax = (function() {
var lastAjax = Promise.resolve();
return function (url, options) {
// chain to the prior promise so this won't get resolved until all prior items
// in the queue have been fulfilled in some way
var priorPromise = lastAjax.catch(function() {
// always fulfilled
return;
});
var ajaxPromise = doAjax(url, options).then(function(val) {
return {val: val};
}, function(err) {
return {err: err};
});
lastAjax = Promise.all([ajaxPromise, priorPromise]).then(function(results) {
var result = results[0];
// if there was an error, then throw to reject with that err
if (result.hasOwnProperty("err")) {
throw err;
} else {
return result.val;
}
});
return lastAjax;
}
})();
// sample usage
queueAjax(someUrl, someOptions).then(function(val) {
// process results
});
queueAjax(someUrl2, someOptions2).then(function(val) {
// process results
});
queueAjax(someUrl3, someOptions3).then(function(val) {
// process results
});
這個排隊系統的功能將在平行Ajax請求,但確保他們.then()
處理程序調用請求的發送順序。與Promise.all()
不同,您可以隨時將新請求添加到隊列中,並將它們添加到序列中。
這是一個工作演示:https://jsfiddle.net/jfriend00/7r2j1qme/
如果我需要那麼我的選擇是websocket。 Websocket更安全(不完全如http://blog.ironwasp.org/2014/11/analysing-testing-and-fuzzing-websocket.html)。客戶端請求的順序由服務器'.on('data''定義,所有的請求必須通過客戶端+服務器的時間戳存儲到數組中。服務器必須按時間戳執行請求數組。 –
是的,我同意..你可以檢查我的遊戲github ..link是在我的生物...我做了簡單的遊戲與畫布和socket.io –
如果你與承諾連鎖,然後第二個Ajax請求不發送,直到第一次完成,所以這是一個秩序的總保證 – jfriend00