理解什麼是 race-condition

很重要的東西!

舉個例子

這兩個 request 都是去讀取書籍的資料,請問輸出結果會是?

備註:API 來源

1
2
3
4
5
6
7
8
9
10
const request = require('request');
const API_ENDPOINT = 'https://lidemy-book-store.herokuapp.com';

request(`${API_ENDPOINT}/books/1`, (err, res, body) => {
console.log('1', body)
})

request(`${API_ENDPOINT}/books/2`, (err, res, body) => {
console.log('2', body)
})

雖然你一定會以為是按照順序: 1 => 2,但實際上並不是這樣子:

race-condition

為什麼會這樣子?

1. 因為你不知道 request 實際送到伺服器的時間

有可能第一個先送到,也有可能第二個先送到,這個沒有絕對。

2. 因為你不知道 server 實際上得花多久時間處理你的 request

假設現在真的第一個先送到好了,你也沒辦法確保第一個會處理的比第二個快,因為有可能 server 花了比較多時間處理第一個,所以最後第二個 request 先回來,這也是有可能的。

3. 因為你不知道 sever 傳 response 回來的實際時間

一樣的意思,sever 傳東西回來也是一個無法預估的時間,所以這個也會影響最後的結果。

這裡也有一個很好的解釋:

1
2
order('一份洋蔥圈')
order('一份漢堡')

我先後發送了兩個 order,而餐點送來的順序就會是 洋蔥圈 => 漢堡 嗎? 不一定吧!可能會跟廚房做菜的習慣或各種原因都會影響到送餐順序。

所以這個就叫做「race condition」,最後的結果完全憑當下他們競爭的結果,你在事前無法預料結果是什麼。

所以怎麼確保執行順序?

拿到第一個 response 後才發出第二個 request:

1
2
3
4
5
6
7
8
9
10
const request = require('request');
const API_ENDPOINT = 'https://lidemy-book-store.herokuapp.com';
// 第一個 request
request(`${API_ENDPOINT}/books/1`, (err, res, body) => {
console.log('1', body)
// 拿到 response 才後發第二個 request
request(`${API_ENDPOINT}/books/2`, (err, res, body) => {
console.log('2', body)
})
})

這樣順序就絕對會是 1 => 2,因為第二個 request 是在第一個 request 處理完後才發出去的。

在做 JSON.parse 之前 mentor-program-day26
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×