首頁 web前端 js教程 javascript非同步程式碼書寫規格Promise學習筆記_javascript技巧

javascript非同步程式碼書寫規格Promise學習筆記_javascript技巧

May 16, 2016 pm 04:14 PM
javascript promise 非同步程式設計

最近工作輕鬆了一點,想起了以前總是看到的一個單字promise,於是耐心下來學習了一下。

一:Promise是什麼?為什麼會有這個東西?

首先說明,Promise是為了解決javascript非同步程式設計時候程式碼書寫的方式產生的。
隨著javascript的發展,異步的場景越來越多。前端有AJAX,setTimeout等,後端Node非同步更多。按照傳統的做法,那麼就是各種回調嵌回調。程式碼可以把人繞暈。
這時候,CommonJS社群提出了一個叫做Promise/A 的規範,這個規範定義瞭如何書寫非同步程式碼,包括使用when/then/resolve等來組織非同步的程式碼。
這個規範由於很優雅,所以相繼就有很多人實現了這個規範,其中包括 瀏覽器原生支援的Promise(), jQuery裡面的deferred,when.js等。
因為這幾個函式庫都符合該規範,所以學習一個也就可以了。我主要學習了jQuery的deferred,所以本文主要講講這個實作。
 
二:jQuery的deferred

首先,關於deferred對象,阮一峰老師有篇文章寫的很詳細了,地址點這。建議可以先看看他的那篇文章,再繼續往下看。
上面說過,promise是為了解決非同步(例如ajax)的,那麼我們來比較下他們的差異。
經典的jQuery的AJAX的寫法是

複製程式碼 程式碼如下:

$.ajax({
    type: "get",
    url: "",
    success: function () {},
    error; function () {}
});

其中success和error參數便是成功/失敗時候的回呼函數。 

而現在jQuery的AJAX寫法成了

複製程式碼 程式碼如下:

$.ajax({
    type; "get",
    url: ""
}).done(function () {}).fail(function () {});

其中成功後會呼叫done裡面的函數,失敗便會呼叫fail裡面的函數。 

看到這裡也許你就會有疑問了,done/fail這些方法是哪個物件上的? $.ajax()回傳了什麼對象,為什麼有這兩個方法?
答案就在下面介紹的Deferred物件。

jQuery提供了一種新的類型Deferred。透過$.Deferred()來產生。例如

複製程式碼 程式碼如下:

var def = $.Deferred();

這個def繼承了很多方法,有done/fail/resolve/reject等。
所以這裡我們也就知道,上面$.ajax()其實回傳的也就是這個物件。
 
deferred物件有很多方法,這裡介紹幾種常用的,更多的可以參考 API
 
首先自然是生成一個def物件。這裡有很多方法,例如:

複製程式碼 程式碼如下:

var def = $.Deferred();    // 自行產生
$.ajax({});    // ajax方法回傳的也是def物件
$.when();    // when方法也會回傳一個def物件

這裡,$.when()可以單獨講講,這個方法通常接收一個或多個deferred對象,然後根據這些deferred對象的狀態情況,來決定$.when()返回的對象的狀態。其中有個使用情境就是多個ajax請求,如果其中一個失敗就都算失敗,那麼便可以在$.when()中傳入多個ajax方法,例如$.when($.ajax(), $. ajax())。然後$.when會回傳一個def物件(根據這兩個請求結果的來判斷)。
 
接著得到了def對象,便有了一系列改變這個對象狀態的方法

複製程式碼 程式碼如下:

def.resolve();    // 把def物件設定成已經完成,然後就會立刻執行綁定在def.done()裡面的函數。
def.reject();    // 把def物件設定成已經失敗,然後就會立刻執行綁定在def.fail()裡面的函數。
def.notify();    // def物件執行中,對應的回呼是def.progress()。

緊接著是設定回呼的方法,順序和上面的對應,也就是什麼狀態會呼叫到什麼回呼

複製程式碼 程式碼如下:

def.done();    // 對應def.resolve();
def.fail();    // 對應def.reject();
def.progress();    // 對應 def.notify();
// 特殊的
def.always();    // 成功或失敗都會呼叫
def.then();    // 接受多個函數,依序依序為成功(done),失敗(fail)和進行中(progress)

其實到這裡位置,deferred物件的用法也就差不多了。不過jQuery也提供了幾個API

複製程式碼 程式碼如下:

// 檢查目前狀態類別
def.isRejected();
def.isResolved();
def.state();

這幾個api顧名思義,就不具體講了,具體可以查看上面給的jQuery API文件。
 
還有一個方法,就是有時候我們希望給外部一個def對象,然後這個對象可以設定各種狀態的回調,但是不能改變它的狀態,那麼就可以用

複製程式碼 程式碼如下:

def.promise();

傳回一個promiese對象,是deferred物件的子集,可以用done/fail等方法,沒有resolve/reject等方法,主要是為了保護不讓外部去修改def對象的狀態。 

至此,關於promise已經全部講完,大家現在就可以把它用在自己的專案中了,另外提早給大家拜個早年,祝大家羊年洋洋得意^ ^。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++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實現非同步網路請求。

言出必行:兌現承諾的好處和壞處 言出必行:兌現承諾的好處和壞處 Feb 18, 2024 pm 08:06 PM

在日常生活中,我們常常會遇到承諾與兌現之間的問題。無論是在個人關係中,或是在商業交易中,承諾的兌現都是建立信任的關鍵。然而,承諾的利與弊也常常會引起爭議。本文將探討承諾的利與弊,並給予一些建議,如何做到言出必行。承諾的利是顯而易見的。首先,承諾可以建立信任。當一個人信守承諾時,他會讓別人相信自己是個可信賴的人。信任是人與人之間建立的紐帶,它可以讓人們更加

簡易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())處理異常。

深入了解Promise.resolve() 深入了解Promise.resolve() Feb 18, 2024 pm 07:13 PM

Promise.resolve()詳解,需要具體程式碼範例Promise是JavaScript中一種用來處理非同步操作的機制。在實際開發中,常常需要處理一些需要依序執行的非同步任務,而Promise.resolve()方法就是用來傳回一個已經Fulfilled狀態的Promise物件。 Promise.resolve()是Promise類別的靜態方法,它接受一個

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

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

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

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

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

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

See all articles