JavaScript默認是同步執(zhí)行的——代碼一行接一行跑,前一句沒跑完,后一句就得等著。這種線性執(zhí)行方式簡單直觀,但遇到耗時的操作就麻煩了。
API請求、數(shù)據(jù)庫查詢、文件讀取、定時器(setTimeout)這些任務都需要時間。如果JavaScript傻等著它們完成,整個程序就會卡死,頁面失去響應。為了解決這個問題,JavaScript支持異步編程。
![]()
Promise就是異步編程的核心工具之一。它是一個對象,代表某個異步操作最終可能完成或失敗的狀態(tài)。有了Promise,JavaScript可以在等待耗時任務的同時,繼續(xù)執(zhí)行其他代碼。
Promise有三種狀態(tài):Pending(進行中)、Resolved(成功完成)、Rejected(失敗)。狀態(tài)一旦改變就不可再變。
在Promise出現(xiàn)之前,開發(fā)者用回調(diào)函數(shù)處理異步任務。回調(diào)函數(shù)作為參數(shù)傳給另一個函數(shù),等異步操作完成后再執(zhí)行。單個回調(diào)還算好辦,但多個異步操作互相依賴時,代碼就會層層嵌套,形成所謂的"回調(diào)地獄"(Callback Hell)。
想象一下軟件開發(fā)流程:分析需求→設計架構→編寫代碼→測試→部署。如果每一步都依賴前一步的結果,用回調(diào)函數(shù)寫出來就是這樣:
analyse(() => { design(() => { develop(() => { test(() => { deploy(() => { console.log("SDLC completed"); }); }); }); }); });
這種金字塔式的嵌套結構難以閱讀和維護,錯誤處理也很混亂。這就是回調(diào)地獄的典型癥狀。
Promise的鏈式調(diào)用徹底改變了這一局面。每個函數(shù)返回一個Promise對象,然后用.then()串聯(lián)起來:
analyse() .then(() => design()) .then(() => develop()) .then(() => test()) .then(() => deploy()) .then(() => console.log("SDLC completed"));
代碼從橫向嵌套變成了縱向鏈式,結構清晰多了。配合async/await語法,還能進一步簡化成看似同步的寫法。Promise的價值不在于技術本身多復雜,而在于它把異步代碼的組織方式從"嵌套陷阱"變成了"流水線"。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.