順序執行 vs. 異步操作:
當我們說“順序執行”,通常是指 操作按順序發生。而 異步操作 指的是操作在后臺執行,不會阻塞其他操作,通常會使用回調、Promise
或 async/await
來處理結果。
在 Promise
鏈式調用 的情況下,雖然每個 .then()
是 按順序執行 的,但這些操作本身都是 異步的,這意味著每個 .then()
執行時,前一個操作的結果是異步得到的,不會阻塞后續操作的執行。
順序與異步的混合:
當我們使用 Promise
時,順序 和 異步 是兩個不同的概念,它們結合在一起工作。
順序執行:
- 你在
.then()
鏈中編寫的每個操作是 順序執行的,即每個操作都等待前一個操作的完成再執行。
異步執行:
- 每個
.then()
返回的Promise
是 異步的,它不會阻塞主線程的執行。 - 異步操作仍然會在后臺執行,只有當
Promise
被解析或拒絕時,才會執行相應的回調。
為什么說 .then()
是順序的異步操作?
讓我們用一個具體的例子來說明:
console.log("開始");getData().then(data => {console.log("第一個異步操作完成", data);return processData(data); // 返回 Promise}).then(parsedData => {console.log("第二個異步操作完成", parsedData);return saveData(parsedData); // 返回 Promise}).then(savedData => {console.log("第三個異步操作完成", savedData);}).catch(error => {console.log("發生錯誤", error);});console.log("結束");
執行流程:
-
getData()
:這是一個異步操作,可能是從網絡請求數據或文件。它返回一個Promise
,并繼續執行后續代碼,不會阻塞主線程。 -
then(data => {...})
:當getData()
的Promise
被解析后,這個回調函數才會被執行,data
會傳遞給這個回調。如果你有多個.then()
,它們會 按順序 執行,但每個操作本身都是異步的,意味著它們是 非阻塞的。 -
return processData(data)
:每個.then()
返回的值(例如processData()
)會自動成為下一個.then()
的輸入。每個返回的操作是 異步的,并且是順序進行的。 -
輸出:
"開始"
和"結束"
會立即輸出,表明主線程沒有被阻塞。- 然后,異步操作會按順序執行:第一個
getData()
完成后,第二個processData()
執行,依此類推。 - 錯誤處理:如果在任何一個
.then()
中發生錯誤,它會跳到.catch()
中。
總結:
- 每個
.then()
中的操作 按順序執行,即一個操作等待前一個操作完成后再執行,確保異步操作的順序性。 - 異步 是指這些操作本身不會阻塞主線程的執行,后臺會并行進行處理。
- 因此,
.then()
是順序執行的異步操作,順序 指的是它們的執行順序,而 異步 指的是每個操作本身不阻塞其他任務的執行。