小程序Promise不支持finally解決方案


小程序Promise不支持finally解決方案

代碼片段

點擊鏈接即可在微信開發者工具中查看代碼wechatide://minicode/t2eidemj7P3X

git地址

基本思路

小程序的Promise是不支持polyfill方法的,這樣有一些操作就不太方便玩了,比如hideLoading,總不能在resolve和reject寫兩遍吧,這樣不優雅。其實稍微有些經驗的前端開發工程師都清楚,如果一個東西原生不支持,可以引入他的polyfill庫,小程序上也是從這個思路出發的,不過小程序有兩個比較坑的地方,就是我們取不到全局變量,換句話說就是直接console.log(this),結果是undefined

那我們引用一個Promise庫應該如何使用呢?我們不妨來讀一下Promise-polyfill的源碼。

跳過Promise的實現,我們看到他最后是把Promise綁定到全局對象上,就是圖中的globalNS,那么我們只要找到globalNS代表什么就知道Promise在哪了,可以看到他依次判斷selfwindowglobal。通過我們的實踐發現,前面兩個還真的是undefined,那么我們可以肯定Promiseglobal對象上,最后輸出看了一下,還真是。

找到了Promise實際上這一步就可以用它了,但是還是比較麻煩,因為如果用引用的第三方庫的Promise需要加global前綴,不加的話還是原生的,我們可以直接用賦值號干掉原生的Promise。

大功告成,至此可以放心大膽的使用Promise規范支持的各個功能了,還可以根據自己的需求修改Promise的實現來定制功能。

思考

為何小程序直接console.log(this)undefined?注意此時的this是最外層的this,不是Page里面的this更不是Component里面的this,這個問題我也不是特別清楚,雖然在js文件中無法輸出window對象,但是如果直接在控制台輸入window是可以的,並且我們修改Promise之后,window.Promise也變成修改后的值了,所以我猜想,window對象還是存在的,但是微信把他隱藏起來了,以至於我們只能訪問window下面的屬性,由此也導致,全局this也是undefined並不是global。當然這只是一個猜想,如果有其他想法也歡迎和我討論。

延伸

關於Promise兼容問題還是比較好解決的,不過Promise的實現可以手撕一下,不到200行的代碼量能學到很多東西。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM