jsonp是什么

今天來跟大家講講故事,一個人很心酸的故事,jsonp是什么?

故事的背景起源于我們主管要求我完善的一個功能,在登錄接口401的時(shí)候跳轉(zhuǎn)登錄頁面,其實(shí)講道理這應(yīng)該是個很簡單的功能,但是我打開我的代碼瞅了一眼,發(fā)現(xiàn)我天,我的接口請求都是jsonp的,我去,我真心不知道jsonp怎么拿到請求狀態(tài)碼。。。一臉懵逼,于是就開始問度娘,搜索了好多頁的關(guān)鍵詞,終于看到了希望,同時(shí)也看到了絕望。。。

jsonp有很多缺陷的,比如:

1,不能接受HTTP狀態(tài)碼

2,不能使用POST提交(默認(rèn)GET)

3,不能發(fā)送和接受HTTP頭

4,不能設(shè)置同步調(diào)用(默認(rèn)異步)

...

其最嚴(yán)重的就是不能提供錯誤處理,如果請求的代碼正常執(zhí)行那么會得到正確的結(jié)果。如果請求失敗,如404,500之類,那么可能什么都不會發(fā)生。

這是我看到的一篇博客上的原話,我仔細(xì)思考了一下,確有道理。

再往下看它的解決方法哈:onerror

IE9/10/Firefox/Safari/Chrome都支持script的onerror事件,如果請求失敗,在onerror上可以進(jìn)行必要的回調(diào)處理,但是,程序猿最怕但是,一聽到這句話就感覺是兼容,omg,兼容問題,所以在IE6/7/8/Opera不支持onerror

最后這位博主給了最詳細(xì)的解決方法:

1,IE9/Firefox/Safari/Chrome 成功回調(diào)使用onload事件,錯誤回調(diào)使用onerror事件

2,Opera 成功回調(diào)也使用onload事件(它壓根不支持onreadystatechange),由于其不支持onerror,這里使用了延遲處理。即等待與成功回調(diào)success,success后標(biāo)志位done置為true。failure則不會執(zhí)行,否則執(zhí)行。這里延遲的時(shí)間取值很有技巧,之前取2秒,在公司測試沒問題。但回家用3G無線網(wǎng)絡(luò)后發(fā)現(xiàn)即使所引用的js文件存在,但由于網(wǎng)速過慢,failure還是先執(zhí)行了,后執(zhí)行了success。所以這里取5秒是比較合理的。雖然這種方式間接實(shí)現(xiàn)了failure,但不徹底。

3,IE6/7/8成功回調(diào)使用onreadystatechange事件,錯誤回調(diào)幾乎是很難實(shí)現(xiàn)的。令人惡心的是即使請求的資源文件不存在(404)。它的readyState也會經(jīng)歷“l(fā)oaded”狀態(tài)。這樣你就沒法區(qū)分請求成功或失敗。最后使用前后臺一起協(xié)調(diào)的機(jī)制解決最后的這個難題。無論請求成功或失敗都讓其調(diào)用callback(true)。 此時(shí)已經(jīng)將區(qū)別成功與失敗的邏輯放到了callback中,如果后臺沒有返回jsonp則調(diào)用failure,否則調(diào)用success。

其實(shí)說了這么多,總結(jié)出來就一句話,如果你要使用jsonp一定要知道并接受它的缺點(diǎn),因?yàn)槟阒荒苓m應(yīng)它,最好的方式就是盡量不要使用jsonp,跨域這塊交給后端來解決,那樣前端就可以使用一些axios、fetch、http等框架來發(fā)送請求,你就能正常的拿到你想要的狀態(tài)碼等一系列vip待遇。

好了,你們覺得我最后怎么解決這個問題的呢???

參考地址:https://www.cnblogs.com/zhouchaoyi/articles/2085924.html

http://www.itdecent.cn/p/1f4c6354f4e6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 介紹JSONP之前 ,我們先了解一下,頁面數(shù)據(jù)交互的發(fā)展過程。來看下面一個例子。付款是我們?nèi)粘V谐R姷囊环N金錢交易...
    charllote8閱讀 627評論 0 3
  • 高級就要跟后臺打交道MySQL My是數(shù)據(jù)庫作者女兒的名字 開服務(wù)之后,頁面如下: 問題:刷新之后,數(shù)值又恢復(fù)...
    tsl1127閱讀 288評論 0 0
  • title: JSONP是什么?date: 2018-10-06 11:34:12tags: [JavaScrip...
    祈念念念閱讀 801評論 0 0
  • 前端操作數(shù)據(jù)庫 首先,我們試著通過前端來操作一個數(shù)據(jù)庫。數(shù)據(jù)庫是什么?只要能長久的存數(shù)據(jù),就是數(shù)據(jù)庫。文件系統(tǒng)是一...
    是劉快啊閱讀 439評論 0 2
  • https://segmentfault.com/a/1190000007935557 一、JSONP的誕生 首先...
    JamHsiao_aaa4閱讀 281評論 0 0

友情鏈接更多精彩內(nèi)容