JavaScript非同步程式設計Promise模式的6個特性_javascript技巧
在我們開始正式介紹之前,我們想看看Javascript Promise的樣子:
var p = new Promise(function(resolve, reject) {
resolve("hello world");
});
p.then(function(stren(function(stren(function(str. ) {
alert(str);
});
1. then()回傳一個Forked Promise
以下兩段程式碼有什麼差別呢?
// Exhibit A
(/*...*/);
p.then(func1);
p.then(func2);
// Exhibit B
var p = new Promise(/ *...*/);
p.then(func1)
.then(func2);
如果你認真以上兩段程式碼等同的話,那麼Promises只不過是一個一維的回調函數數組。然而,其實不是這樣的。每一個then()呼叫都回傳一個forked promise。因此,在ExhibitA中,如果func1()拋出一個異常,func2()仍舊正常呼叫。
在ExhibitB中,如果func1()拋出一個錯誤,fun2()將不會被調用,因為第一個調用返回了一個新的promise,這個在func1()中會被拒絕。結果是func2()被跳過。
總結:promises可以被fork成多個路徑,類似複雜的流程圖。
2. Callback應該傳遞結果
當你執行下面程式碼的時候什麼會得到警告提示呢?
var p = new Promise(function(resolve, rejunction) {
resolve("hello world");
});
p.then(function(str) {})
.then(function(str) {
alert (str);
});
第二個then()中的alert沒有顯示任何內容。這是因為回呼函數,在promise的上下文中,因為結果的變化並沒有回調函數。 promise期望你的回呼函數會傳回同樣的結果或回傳一個替換結果,然後被傳遞到下一個回呼函數。
類似使用adpater來變化結果,如下:
var feetToMetres = function(ft) { return ft*12*0.0254 };
var p = new Promise(/*...*/);
p.then(feetToMetres)
.then(function(metres) {
alert(metres);
});
3. 只有來自上一層的異常可以被捕捉
這兩段程式碼有什麼差別?
// Exhibit A resolve("hello world");
})
.then(
function(str) {
throw new Error("uhoh"); > },
undefined
)
.then(
undefined,
function(error) {
alert(error);
// Exhibit B
new Promise(function(resolve, reject) {
resolve("hello world");
}).then(
function(str
throw new Error("uh oh");
},
function(error) {
alert(error);
}
alert(error);
}
在第二段程式碼中,回呼函數和錯誤回呼函數是同一個層次,表示當異常在回呼中拋出,將不會被捕捉。事實上,第二段程式碼的錯誤回呼將只會在promise為拒絕狀態或promise本身出錯的情況下拋出
4. 錯誤可以被恢復
在一個錯誤回呼函數中,如果你不重新拋出錯誤,promise會假設你已經從錯誤中恢復,並且反轉成為已解決狀態。在下一個例子中,"i'm saved" 將會被顯示,這是因為在第一個then()中的錯誤回呼沒有重新拋出異常。 複製程式碼
var p = new Promise(function(resolve, reject) {
reject(new Error("pebkac"));
});
p.then(
undefined,
function(error) { }
)
.then(
function(str) {
alert("I am saved!")
alert("I am saved!")
🎜> function(error) {
alert("Bad computer!");
}
);
Promise可以被視為洋蔥上的層次。每一個then()再加一個層次到洋蔥。每一個層次代表了一個被處理的活動。當層次結束,結果被認為已經修復並且為下一個層次做好了準備。
5. Promises可以被暫停
因為你已經準備好了在一個then()方法中執行,並不意味著你不能夠暫停並且提前運行其他。 為了暫停目前的promise,或讓它等待以便另外一個promise完成,簡單在then()中返回另外一個promise。
var p = new Promise(/*... /);
p.then(function(str) {
if(!loggedIn) {
return new Promise(/*...*/);
}
}
})
.then(function(str) {
alert("Done.");
在前面程式碼中,直到新的promise解析後提示才會出現。這是一個方便的方式在已存在的非同步程式碼路徑中來引入更多地依賴。例如,你可能發現使用者session已經timeout,而且你可能會想要在繼續前面的程式碼路徑前初始化第二個登陸。
6. Resolved Promises並不會立刻執行
運行下面程式碼會得到提示框麼?
function runme() {
function runme() {
function runme() {
;
new Promise(function(resolve) {
}) .then(function() { ); alert(i);}因為promise立刻被解析,然後then()方法立刻執行,所以你可能會認為會探出提示2。但是promise定義要求所有的呼叫都被強制非同步。因此提示會在被修改前產生。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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