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