JavaScript實現非同步程式設計的方法有:易於理解和實作但是程式碼不好維護的回呼方法,發布/訂閱方法,易於理解並且可綁定多個事件但是工作流程混亂的事件監聽方法,Promises方法
非同步模式是非常重要,在瀏覽器端長時間運行的操作應該非同步執行,以避免不回應。接下來將在文章中為大家詳細介紹JavaScript中非同步程式設計方法的實現,具有一定參考作用,希望對大家有幫助。
【推薦課程:#JavaScript教學##】
大家都知道JavaScript的執行環境是單執行緒的,單執行緒就代表在任何時候都只能執行一個任務。如果遇到多任務的時候就需要在佇列中等待上一任務的完成。因此耗費時間比較多,同步模式就類似這種單執行緒模式,非同步模式是完全不同的,每個任務都有一個回呼函數,當一個任務完成後,它將執行回調函數,後面的任務可以與前一個任務同時運行。任務的執行順序與佇列中的任務序列不同。方法一:回呼方法
這個方法是非同步程式設計的基本方法,假設有兩個函數f1和f2,後者會等待第一個函數的結果。F1(); F2();如果f1是長時間運行的操作,則可以重寫f1並將f2作為f1的回呼函數。
function f1(callback){ setTimeout(function () { callback(); }, 1000); }使用此模式,同步操作就可以轉換為非同步操作,f1不會阻止程式執行,它會將先執行主邏輯然後再執行耗時的操作#回呼函數的優點是易於理解和實現,缺點是程式碼不可讀和可維護,不同的元件高度耦合,工作流程非常混亂,每個任務只能有一個回調函數。
方法二:發布/訂閱
此事件可以理解為訊號,假設存在訊號中心,如果一個任務完成,它將向訊號中心發布訊號,其他任務可以從訂閱訊號中心接收指定訊號。這種方法就稱為發布/訂閱模式或是觀察者模式。 範例:f2向訊號中心訂閱完成訊號jQuery.subscribe(“done”,f2);然後寫f1為
function f1(){ setTimeout(function () { jQuery.publish("done"); }, 1000); }
jQuery.publish(「done」)表示當f1完成執行時它將向訊號中心發送完成訊號,然後f2將開始執行。
jQuery.unsubscribe(“done”,f2);
方法三:事件監聽
另一種方法是事件驅動模式,一個任務的執行不依賴程式碼順序,它們等待一個事件發生。在本例中仍然使用f1和f2,首先將一個事件綁定到f1。f1.on('done',f2);上述程式碼的意思是如果f1完成事件發生,則執行f2。
function f1(){ setTimeout(function () { f1.trigger('done'); }, 1000); }
f1.trigger('done')表示它將觸發done事件,然後在執行完成時執行f2。
方法四:Promises方法
Promises物件是CommonJS提出的標準,目的是為非同步程式設計提供通用介面。每個非同步任務都會傳回一個Promises對象,這個物件有一個允許設定回呼函數的then方法。例如,f1的回呼函數f2:F1().then(F2)f1應寫成:
function f1(){ var dfd = $.Deferred(); setTimeout(function () { dfd.resolve(); }, 500); return dfd.promise; }#優點是回呼函數是連結的,程式的工作流程非常清晰,它有一套完整的連結方法,可用於實現強大的功能。 例如,設定多個回呼函數:
f1().then(f2).then(f3);還有一個例子,如果有錯誤:
f1().then(f2).fail(f3);其他三種方法不具備的一個優點是一旦完成一個任務,如果添加更多的回調函數,它們將立即執行。缺點是它不容易理解。 總結:以上就是這篇文章的全部內容了,希望對大家有幫助。
以上是javascript非同步程式設計方法有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!