首頁 web前端 js教程 javascript非同步程式設計方法有哪些

javascript非同步程式設計方法有哪些

Apr 19, 2019 pm 01:07 PM
javascript 非同步程式設計

JavaScript實現非同步程式設計的方法有:易於理解和實作但是程式碼不好維護的回呼方法,發布/訂閱方法,易於理解並且可綁定多個事件但是工作流程混亂的事件監聽方法,Promises方法

非同步模式是非常重要,在瀏覽器端長時間運行的操作應該非同步執行,以避免不回應。接下來將在文章中為大家詳細介紹JavaScript中非同步程式設計方法的實現,具有一定參考作用,希望對大家有幫助。

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將開始執行。

當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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何用 C++ 函數實作非同步程式設計? 如何用 C++ 函數實作非同步程式設計? Apr 27, 2024 pm 09:09 PM

摘要:C++中的非同步程式設計允許多工處理,無需等待耗時操作。使用函數指標建立指向函數的指標。回調函數在非同步操作完成時被呼叫。 boost::asio等函式庫提供非同步程式支援。實戰案例示範如何使用函數指標和boost::asio實現非同步網路請求。

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

Java框架非同步程式設計中常見的問題與解決方案 Java框架非同步程式設計中常見的問題與解決方案 Jun 04, 2024 pm 05:09 PM

Java框架非同步程式設計中常見的3個問題和解決方案:回呼地獄:使用Promise或CompletableFuture以更直覺的風格管理回呼。資源競爭:使用同步原語(如鎖)保護共享資源,並考慮使用執行緒安全性集合(如ConcurrentHashMap)。未處理異常:明確處理任務中的異常,並使用異常處理框架(如CompletableFuture.exceptionally())處理異常。

golang框架如何處理並發和非同步程式設計? golang框架如何處理並發和非同步程式設計? Jun 02, 2024 pm 07:49 PM

Go框架利用Go的並發和非同步特性提供高效處理並發和非同步任務的機制:1.透過Goroutine實現並發,允許同時執行多個任務;2.透過通道實現非同步編程,在不阻塞主執行緒的情況下執行任務;3.適用於實戰場景,如並發處理HTTP請求、非同步取得資料庫資料等。

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態碼取得方法簡介:在進行前端開發中,我們常常需要處理與後端介面的交互,而HTTP狀態碼就是其中非常重要的一部分。了解並取得HTTP狀態碼有助於我們更好地處理介面傳回的資料。本文將介紹使用JavaScript取得HTTP狀態碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態碼HTTP狀態碼是指當瀏覽器向伺服器發起請求時,服務

PHP 非同步程式設計的優勢與劣勢? PHP 非同步程式設計的優勢與劣勢? May 06, 2024 pm 10:00 PM

非同步程式設計在PHP的優勢包括更高的吞吐量、更低的延遲、更好的資源利用和可擴展性。其劣勢包括複雜性、調試難度和有限的庫支援。在實戰案例中,ReactPHP用於處理WebSocket連接,展示了非同步程式設計的實際應用。

Python非同步程式設計: 實現高效並發的非同步程式碼之道 Python非同步程式設計: 實現高效並發的非同步程式碼之道 Feb 26, 2024 am 10:00 AM

1.為什麼要使用非同步程式設計?傳統程式設計使用阻塞式I/O,這表示程式會等待某個操作完成,然後才能繼續執行。這對於處理單一任務可能很有效,但對於處理大量任務時,可能會導致程式變慢。非同步程式設計則打破了傳統阻塞式I/O的限制,它使用非阻塞式I/O,這意味著程式可以將任務分發到不同的執行緒或事件循環中執行,而無需等待任務完成。這允許程式同時處理多個任務,提高程式的效能和效率。 2.python非同步程式設計的基礎Python非同步程式設計的基礎是協程和事件循環。協程是允許函數在暫停和恢復之間切換的函數。事件循環則負責調度

Python非同步程式設計: 揭秘非同步程式設計的本質, 最佳化程式碼效能 Python非同步程式設計: 揭秘非同步程式設計的本質, 最佳化程式碼效能 Feb 26, 2024 am 11:20 AM

非同步編程,英文AsynchronousProgramming,是指程式中的某些任務可以並發地執行,而無需等待其他任務完成,從而提高程式的整體運作效率。在python中,asyncio模組是實現非同步程式設計的主要工具,它提供了協程、事件循環和其他非同步程式設計所需的元件。協程:協程(Coroutine)是一種特殊的函數,它可以被暫停然後恢復執行,就像線程一樣,但協程比線程更輕量級,記憶體消耗更低。協程由async關鍵字聲明,並在await關鍵字暫停執行。事件循環:事件循環(EventLoop)是非同步程式設計中的

See all articles