程序的可擴展性,可伸縮性
一個應用,當處理少量數據時,可以保證用戶界面響應迅速,動畫流暢;但當面對大量數據涌入的時候,還能做到以上的保證,我們就可以說此應用具備了可擴展性,可伸縮性。
同步和異步
同步方式運行的程序最容易理解,語句一條一條執行,下一條要等上一條執行完才能執行。但現實中并不是每條語句都可以迅速完成,比如一個網絡請求,一個數據庫查詢,一個復雜計算等等都會導致一條語句變成耗時操作,阻塞了程序的繼續執行,導致了應用程序沒有響應,帶來了極差的用戶體驗。眾所周知,Javascript是單線程模式,該如何解決耗時操作問題?沒錯,就是callback(回調)函數。
回調函數其實在Javascript隨處可見,鼠標鍵盤事情的處理,遠程http請求以及文件io操作等等。我們提供給耗時操作一個函數,當耗時操作返回時,Javascript runtime會立刻執行這個函數。與此同時,我們的程序并沒有被阻塞,繼續一條一條的執行下去。這就是以異步方式運行程序。
時間和空間
在同步方式運行的程序中,我們很容易在任意時刻確定某個變量(共享變量)的值,因為同步方式是一條一條執行的指令序列,每條語句都依賴上一條語句的執行。然而在異步方式運行的程序中,每條語句完成的時間是不確定的,也就難以確定某個時刻變量(共享變量)的值是什么;另外,如果我們想讓異步程序像同步程序那樣,按照一定的順序執行,該怎么辦呢?傳統的解決方案是回調函數內嵌異步程序,也就是第一條異步程序的回調函數中調用第二條異步程序,第二條異步程序的回調函數中調用第三條異步程序。然而正是這種內嵌方式形成了眾所周知的回調地獄問題,使我們的程序既不美觀也難以維護。
Promises
ES6中引入了Promises來解決回調地獄問題。promise代表了異步程序,并在未來某個時刻完成。?使用細節請谷歌百度。然而promise也有自身的缺點:
- 數據源產生多個值,比如鼠標移動事情或者文件系統的字節流;
- 沒有失敗重試的機制;
- 沒有取消機制;