Signal 是發出訊號,相當於你是紅綠燈, 綠燈亮了。具體老奶奶走不走,什麼時候走,看情況。直接呼叫函式,相當於你幫著老奶奶過馬路。呼叫函式,save 錯了,這個記錄就沒有,呼叫方是對呼叫結果負責的。我幫老奶奶扶馬路扶摔倒了是要送醫院的。傳送訊號,則老奶奶需要自己對自己的身體負責,拋了異常,和我一個紅綠亮了沒什麼關係
Signal 一般用於釋出訊息,比如,你存一個文件,這個文件還需要同步到 ES/MONGODB, 或者需要打個日誌。這個時候,就有多個 reciever 接收到這個訊號。作為 Sender 呼叫方,類似於亮綠燈。接收到訊號之後:
重寫 save 方法 (不建議透過signal機制來做)
從而使得呼叫方只關心 A 欄位, B欄位根據A欄位在儲存的時候自動賦值.
@ramwin
為什麼不建議透過signal機制來做
舉例子,假如你要讓馬路這邊的老奶奶走到那邊去。有兩種方法,
Signal 是發出訊號,相當於你是紅綠燈, 綠燈亮了。具體老奶奶走不走,什麼時候走,看情況。直接呼叫函式,相當於你幫著老奶奶過馬路。呼叫函式,save 錯了,這個記錄就沒有,呼叫方是對呼叫結果負責的。我幫老奶奶扶馬路扶摔倒了是要送醫院的。傳送訊號,則老奶奶需要自己對自己的身體負責,拋了異常,和我一個紅綠亮了沒什麼關係Signal 一般用於釋出訊息,比如,你存一個文件,這個文件還需要同步到 ES/MONGODB, 或者需要打個日誌。這個時候,就有多個 reciever 接收到這個訊號。作為 Sender 呼叫方,類似於亮綠燈。接收到訊號之後:
1. Reciever 1 說,我來打日誌2. Reciever 2 說,我來同步 ES3. Reciever 3 說,我來同步 MongoDB4. Reciever 4 說,我來扶老奶奶過馬路顯然,這個場景下,使用訊號機制並沒有起到解耦的作用,反而分散程式碼邏輯到不同的地方。閱讀程式碼的體驗還下降了。
當然, 由於 django 的 signal 是同步的, 這個場景下你用他來做也沒問題....只是分散程式碼邏輯到不同的地方。閱讀程式碼的體驗還下降了。