JavaScript.then是JavaScript的異步編程中的重要概念之一,它代表了Promise對象的實(shí)例,是處理異步任務(wù)結(jié)果的一種方式。
通常我們處理異步任務(wù)時(shí),需要使用回調(diào)函數(shù),但這會(huì)導(dǎo)致回調(diào)地獄的產(chǎn)生。回調(diào)地獄是指過多嵌套回調(diào)函數(shù)使得代碼難以維護(hù)的情況。例如:
func1(param1, function(result1) { func2(result1, function(result2) { func3(result2, function(result3) { // ... 以此類推 }); }); });
對于上述代碼,由于回調(diào)函數(shù)形成了嵌套的層級關(guān)系,代碼可讀性差,同時(shí)出錯(cuò)后也不易于調(diào)試。因此,JavaScript.then的出現(xiàn)解決了這一難點(diǎn)。
JavaScript.then的基本使用方法是,先創(chuàng)建并返回一個(gè)Promise對象實(shí)例,該實(shí)例有三種狀態(tài),分別為未完成(pending)、已成功(resolved)、已失敗(rejected)。Promise實(shí)例通過調(diào)用then()方法來處理處理異步操作的結(jié)果:
promise.then(onResolved, onRejected);
其中,then()方法中的兩個(gè)參數(shù)均為可選, onResolved和onRejected 分別是當(dāng)Promise實(shí)例狀態(tài)為resolved或rejected時(shí)respective 成功或失敗的回調(diào)函數(shù)。
此外,then()方法還可以返回另一個(gè)Promise對象,以支持Promise 鏈?zhǔn)秸{(diào)用。 在這種情況下,內(nèi)部Promise對象的狀態(tài)將根據(jù)返回值來設(shè)置。
下面的示例使用Promise來模擬一個(gè)異步任務(wù),并通過鏈?zhǔn)秸{(diào)用來處理結(jié)果:
var promise = Promise.resolve(1); promise.then(function(val) { console.log(val); // 1 return val + 2; }).then(function(val) { console.log(val); // 3 });
上述示例中,Promise.resolve()方法返回一個(gè)成功的Promise實(shí)例,其狀態(tài)為resolved。該實(shí)例通過then()方法鏈?zhǔn)秸{(diào)用兩個(gè)回調(diào)函數(shù),分別在第一個(gè)回調(diào)函數(shù)中將 1 輸出到控制臺(tái),然后返回 1 + 2 = 3,以供第二個(gè)回調(diào)函數(shù)使用,最終將 3 輸出到控制臺(tái)。
總而言之,JavaScript.then是處理異步任務(wù)結(jié)果的重要方式之一。使用Promise對象可以避免回調(diào)函數(shù)嵌套的出現(xiàn),提高代碼的可讀性和可維護(hù)性,以及增強(qiáng)錯(cuò)誤處理的能力。