全棧工程師之路-中級篇之小程序開發-第二章第五節小程序中的Promise

上一節課最後,我們遇到了一個警告。


說我們太過頻繁的調用serData了,因爲我們這個頁面的三部分數據是通過三個接口獲取的。

所以我們分別在三個接口返回的時候調用了數據綁定。

但是過於頻繁的調用setData很容易引起性能問題。

要理解爲什麼會引發性能問題,我們要先看一下setData的工作原理。

https://mp.weixin.qq.com/debug/wxadoc/dev/framework/performance/tips.html#setdata

(官方說明)小程序的視圖層目前使用 WebView 作爲渲染載體,而邏輯層是由獨立的 JavascriptCore 作爲運行環境。在架構上,WebView 和 JavascriptCore 都是獨立的模塊,並不具備數據直接共享的通道。當前,視圖層和邏輯層的數據傳輸,實際上通過兩邊提供的 evaluateJavascript 所實現。即用戶傳輸的數據,需要將其轉換爲字符串形式傳遞,同時把轉換後的數據內容拼接成一份 JS 腳本,再通過執行 JS 腳本的形式傳遞到兩邊獨立環境。
而 evaluateJavascript 的執行會受很多方面的影響,數據到達視圖層並不是實時的。同一進程內的 WebView 實際上會共享一個 JS VM,如果 WebView 內 JS 線程正在執行渲染或其他邏輯,會影響 evaluateJavascript 腳本的實際執行時間,另外多個 WebView 也會搶佔 JS VM 的執行權限;另外還有 JS 本身的編譯執行耗時,都是影響數據傳輸速度的因素。

對於搞不太懂的朋友,那麼可以先不理會,先記下,要儘量的減少調用setData就可以了。

回到我們的問題中。

我們有三個請求,那我們可以等到三個請求的數據全部完成之後再調用setData,我們先按這個思路實現。


我們在第一個請求的回調函數裏面發起了第二個請求的回調函數,同樣的在第二個請求的回調函數裏面發起了第三個回調函數。

保存代碼,運行。返現警告解除了。說明我們這個方案是可以解決問題的。

但是,大家都知道這樣的嵌套關係,不僅不利於閱讀,而且很容易不小心就導致一些很難察覺的問題。

我在很早的教程中就提到了,用promise代替回調函數的概念。http://blog.csdn.net/onil_chen/article/details/51099443

所以這裏我們依舊使用這個思路進行。

es6原生是支持promise的,但是小程序不支持。

所以我們這裏需要引入第三方庫。

比較好用的有Q.js和bluebird.js

這裏我們使用bluebird.js來實現。

下載地址:https://cdn.jsdelivr.net/bluebird/latest/bluebird.min.js

我是直接瀏覽器打開,然後本地新建一個文件保存下來的。

首先我們在index.js中引入文件


然後改寫一下getMovieList方法


最後在onload中修改調用


源文件 百度雲 鏈接:http://pan.baidu.com/s/1boSi0zX 密碼:87ed
這節課的內容就到這裏結束了。
感謝您的閱讀。
我是莽夫,希望你開心。
如果你覺得本文對你有幫助,請掃描文末二維碼,支持博主原創。
希望大家關注我的個人公衆號ionic_


發佈了75 篇原創文章 · 獲贊 61 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章