1. 程式人生 > >全棧工程師之路-中級篇之小程式開發-第二章第五節小程式中的Promise

全棧工程師之路-中級篇之小程式開發-第二章第五節小程式中的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_