今天來跟大家講講故事打厘,一個人很心酸的故事佑吝,jsonp是什么陆馁?
故事的背景起源于我們主管要求我完善的一個功能,在登錄接口401的時候跳轉登錄頁面粒竖,其實講道理這應該是個很簡單的功能,但是我打開我的代碼瞅了一眼几于,發(fā)現(xiàn)我天蕊苗,我的接口請求都是jsonp的,我去沿彭,我真心不知道jsonp怎么拿到請求狀態(tài)碼朽砰。。喉刘。一臉懵逼瞧柔,于是就開始問度娘,搜索了好多頁的關鍵詞睦裳,終于看到了希望造锅,同時也看到了絕望。廉邑。备绽。
jsonp有很多缺陷的,比如:
1鬓催,不能接受HTTP狀態(tài)碼
2肺素,不能使用POST提交(默認GET)
3,不能發(fā)送和接受HTTP頭
4宇驾,不能設置同步調(diào)用(默認異步)
...
其最嚴重的就是不能提供錯誤處理倍靡,如果請求的代碼正常執(zhí)行那么會得到正確的結果。如果請求失敗课舍,如404,500之類塌西,那么可能什么都不會發(fā)生。
這是我看到的一篇博客上的原話筝尾,我仔細思考了一下捡需,確有道理。
再往下看它的解決方法哈:onerror
IE9/10/Firefox/Safari/Chrome都支持script的onerror事件筹淫,如果請求失敗站辉,在onerror上可以進行必要的回調(diào)處理,但是,程序猿最怕但是饰剥,一聽到這句話就感覺是兼容殊霞,omg,兼容問題汰蓉,所以在IE6/7/8/Opera不支持onerror
最后這位博主給了最詳細的解決方法:
1绷蹲,IE9/Firefox/Safari/Chrome 成功回調(diào)使用onload事件,錯誤回調(diào)使用onerror事件
2顾孽,Opera 成功回調(diào)也使用onload事件(它壓根不支持onreadystatechange)祝钢,由于其不支持onerror,這里使用了延遲處理若厚。即等待與成功回調(diào)success拦英,success后標志位done置為true。failure則不會執(zhí)行盹沈,否則執(zhí)行龄章。這里延遲的時間取值很有技巧吃谣,之前取2秒乞封,在公司測試沒問題。但回家用3G無線網(wǎng)絡后發(fā)現(xiàn)即使所引用的js文件存在岗憋,但由于網(wǎng)速過慢肃晚,failure還是先執(zhí)行了,后執(zhí)行了success仔戈。所以這里取5秒是比較合理的关串。雖然這種方式間接實現(xiàn)了failure,但不徹底监徘。
3晋修,IE6/7/8成功回調(diào)使用onreadystatechange事件,錯誤回調(diào)幾乎是很難實現(xiàn)的凰盔。令人惡心的是即使請求的資源文件不存在(404)墓卦。它的readyState也會經(jīng)歷“l(fā)oaded”狀態(tài)。這樣你就沒法區(qū)分請求成功或失敗户敬。最后使用前后臺一起協(xié)調(diào)的機制解決最后的這個難題落剪。無論請求成功或失敗都讓其調(diào)用callback(true)。 此時已經(jīng)將區(qū)別成功與失敗的邏輯放到了callback中尿庐,如果后臺沒有返回jsonp則調(diào)用failure忠怖,否則調(diào)用success。
其實說了這么多抄瑟,總結出來就一句話凡泣,如果你要使用jsonp一定要知道并接受它的缺點,因為你只能適應它,最好的方式就是盡量不要使用jsonp问麸,跨域這塊交給后端來解決往衷,那樣前端就可以使用一些axios、fetch严卖、http等框架來發(fā)送請求席舍,你就能正常的拿到你想要的狀態(tài)碼等一系列vip待遇。
好了哮笆,你們覺得我最后怎么解決這個問題的呢来颤???
參考地址:https://www.cnblogs.com/zhouchaoyi/articles/2085924.html