很重要的東西!
舉個例子
這兩個 request 都是去讀取書籍的資料,請問輸出結果會是?
備註:API 來源
1 | const request = require('request'); |
雖然你一定會以為是按照順序: 1 => 2
,但實際上並不是這樣子:
為什麼會這樣子?
1. 因為你不知道 request 實際送到伺服器的時間
有可能第一個先送到,也有可能第二個先送到,這個沒有絕對。
2. 因為你不知道 server 實際上得花多久時間處理你的 request
假設現在真的第一個先送到好了,你也沒辦法確保第一個會處理的比第二個快,因為有可能 server 花了比較多時間處理第一個,所以最後第二個 request 先回來,這也是有可能的。
3. 因為你不知道 sever 傳 response 回來的實際時間。
一樣的意思,sever 傳東西回來也是一個無法預估的時間,所以這個也會影響最後的結果。
這裡也有一個很好的解釋:
1 | order('一份洋蔥圈') |
我先後發送了兩個 order,而餐點送來的順序就會是 洋蔥圈 => 漢堡 嗎? 不一定吧!可能會跟廚房做菜的習慣或各種原因都會影響到送餐順序。
所以這個就叫做「race condition」,最後的結果完全憑當下他們競爭的結果,你在事前無法預料結果是什麼。
所以怎麼確保執行順序?
拿到第一個 response 後才發出第二個 request:
1 | const request = require('request'); |
這樣順序就絕對會是 1 => 2
,因為第二個 request 是在第一個 request 處理完後才發出去的。