您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關javascript異步編程方法是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
JavaScript實現(xiàn)異步編程的方法有:易于理解和實現(xiàn)但是代碼不好維護的回調(diào)方法,發(fā)布/訂閱方法,易于理解并且可綁定多個事件但是工作流程混亂的事件監(jiān)聽方法,Promises方法
異步模式是非常重要,在瀏覽器端長時間運行的操作應該異步執(zhí)行,以避免不響應。
大家都知道JavaScript的執(zhí)行環(huán)境是單線程的,單線程就意味著在任何時候都只能運行一個任務。如果遇到多任務的時候就需要在隊列中等待上一任務的完成。因此耗費時間比較多,同步模式就類似于這種單線程模式,異步模式是完全不同的,每一個任務都有一個回調(diào)函數(shù),當一個任務完成后,它將執(zhí)行回調(diào)函數(shù),后面的任務可以與前一個任務同時運行。任務的執(zhí)行順序與隊列中的任務序列不同。
方法一:回調(diào)方法
這個方法是異步編程的基本方法,假設有兩個函數(shù)f1和f2,后者將等待第一個函數(shù)的結果。
F1(); F2();
如果f1是長時間運行的操作,則可以重寫f1并將f2作為f1的回調(diào)函數(shù)。
function f1(callback){ setTimeout(function () { callback(); }, 1000); }
使用此模式,同步操作就可以轉(zhuǎn)換為異步操作,f1不會阻止程序執(zhí)行,它會將先執(zhí)行主邏輯然后再執(zhí)行耗時的操作
回調(diào)函數(shù)的優(yōu)點是易于理解和實現(xiàn),缺點是代碼不可讀和可維護,不同的組件高度耦合,工作流非?;靵y,每個任務只能有一個回調(diào)函數(shù)。
方法二:發(fā)布/訂閱
此事件可以理解為信號,假設存在信號中心,如果一個任務完成,它將向信號中心發(fā)布信號,其他任務可以從訂閱信號中心接收指定信號。這種方法就稱為發(fā)布/訂閱模式或者是觀察者模式。
例:f2向信號中心訂閱完成信號
jQuery.subscribe(“done”,f2);
然后寫f1為
function f1(){ setTimeout(function () { jQuery.publish("done"); }, 1000); }
jQuery.publish(“done”)
表示當f1完成執(zhí)行時它將向信號中心發(fā)送一個完成信號,然后f2將開始執(zhí)行。
當f2完成執(zhí)行時,它可以取消訂閱。
jQuery.unsubscribe(“done”,f2);
方法三:事件監(jiān)聽
另一種方法是事件驅(qū)動模式,一個任務的執(zhí)行不依賴于代碼順序,它們等待一個事件發(fā)生。在本例中仍然使用f1和f2,首先將一個事件綁定到f1。
f1.on('done',f2);
上述代碼的含義是如果f1完成事件發(fā)生,則執(zhí)行f2。
function f1(){ setTimeout(function () { f1.trigger('done'); }, 1000); }
f1.trigger('done')
表示它將觸發(fā)done事件,然后在執(zhí)行完成時執(zhí)行f2。
優(yōu)點是它易于理解并且可以綁定多個事件,每個事件都可以具有許多回調(diào)函數(shù),并且它可以解耦哪個有利于模塊化。缺點是整個程序?qū)⒈皇录?qū)動,工作流程不是很清楚。
方法四:Promises方法
Promises對象是CommonJS提出的標準,目的是為異步編程提供通用接口。每個異步任務都會返回一個Promises對象,這個對象有一個允許設置回調(diào)函數(shù)的then方法。例如,f1的回調(diào)函數(shù)f2:
F1().then(F2)
f1應寫成:
function f1(){ var dfd = $.Deferred(); setTimeout(function () { dfd.resolve(); }, 500); return dfd.promise; }
優(yōu)點是回調(diào)函數(shù)是鏈接的,程序的工作流程非常清晰,它有一套完整的鏈接方法,可用于實現(xiàn)強大的功能。
例如,設置多個回調(diào)函數(shù):
f1().then(f2).then(f3);
還有一個例子,如果有錯誤:
f1().then(f2).fail(f3);
其他三種方法不具備的一個優(yōu)點是一旦完成一個任務,如果添加更多的回調(diào)函數(shù),它們將立即執(zhí)行。缺點是它不容易理解。
關于javascript異步編程方法是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。