XHR對象上的send方法不僅是用于發(fā)送數(shù)據(jù)部分,只有調(diào)用了send方法,整個HTTP請求頭才會被發(fā)出,然后才是真正的內(nèi)容部分。如此復雜的過程在規(guī)范中也沒有具體的定義,所以目前各大瀏覽器上的實現(xiàn)都存在細微的差異,特別是同異步這個大坑再次中槍。
一個精密的實驗
其實我以前一直以為send方法總是同步發(fā)起的(注意這里討論的是“發(fā)起”這個行為本身的同異步,open方法的第三個參數(shù)始終為true,不討論false的情況),還在討論同異步的文章中使用了XHR對象的例子,現(xiàn)在看來確實是個不恰當?shù)睦印T谝恍g覽器中XHR對象的send方法確實是同步發(fā)起的,但并不是所有瀏覽器都這樣,可以通過下面的實驗來證實(NodeJS 的部分需要 harmony 和 use_strict):
//nodejs
require('http').createServer(function(request,response){
response.setHeader('Content-Type','text/html');
if(request.url=='/test'){
console.log(request.url);
let connection=request.connection;
connection.write('HTTP/1.1 100 Continue\n\n');
console.log(100);
request.on('data',function(e){
console.log(e+"");
response.end('ok');
});
}else{
let path=process.cwd()+request.url;
require('fs').readFile(path,function(error,data){
response.end(error?'error':data);
});
};
}).listen(1234);
這個測試在三大主流瀏覽器上測試會得到三個不同的結(jié)果:
Chrome39:請求同步發(fā)出,死循環(huán)不會影響請求
Firefox33:請求被注冊到下一個消息中異步發(fā)出
IE11:請求的頭部分同步發(fā)出,內(nèi)容部分被注冊到下一個消息中異步發(fā)出
實驗結(jié)果影響的現(xiàn)實
這個結(jié)果對實際運用有什么影響呢?在同步過程中多次調(diào)用open方法就能看出差異。XHR對象在調(diào)用open方法時會停止原來的工作,于是有以下幾種情況:
Chrome的send是同步發(fā)出的,即使在send之后馬上調(diào)用open也無法停止已經(jīng)send的東西了,已經(jīng)潑出去的水,根本停不下來。
Firefox就完全不同,由于是注冊到下一個消息中,send后馬上調(diào)用open就會取消掉原先注冊但還沒執(zhí)行到的動作。
IE比較奇葩,在調(diào)動send時頭已經(jīng)發(fā)出了,這部分是收不回來的。send后馬上調(diào)用open只能阻止內(nèi)容部分的發(fā)出。
本文來源于成都網(wǎng)站建設公司與成都網(wǎng)站設計制作公司-創(chuàng)新互聯(lián)成都公司!
文章標題:XHR對象send方法的同異步問題
標題網(wǎng)址:http://redsoil1982.com.cn/news14/319814.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、微信小程序、小程序開發(fā)、手機網(wǎng)站建設、網(wǎng)站設計、面包屑導航
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源:
創(chuàng)新互聯(lián)