1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
讓我為你整理這些重要的 JavaScript 異步程式設計里程碑

## Promise  async/await 的歷史

### Promise
- **ECMAScript 6 (ES2015)** - 2015年正式引入
- **瀏覽器支援**
  - Chrome 32+ (2014)
  - Firefox 29+ (2014)
  - Safari 8+ (2014)
  - IE 不支援Edge 12+ (2015)

### async/await
- **ECMAScript 2017 (ES8)** - 2017年正式引入
- **瀏覽器支援**
  - Chrome 55+ (2016)
  - Firefox 52+ (2017)
  - Safari 10.1+ (2017)
  - Edge 14+ (2016)

## MQTT  JavaScript 的發展

### MQTT 協定本身
- **MQTT 1.0** 1999年由 IBM 開發
- **MQTT 3.1** 2010年公開發布
- **MQTT 3.1.1** 2014年成為 OASIS 標準
- **MQTT 5.0** 2019年發布

### JavaScript MQTT 函式庫

#### 1. **mqtt.js**最流行的 Node.js MQTT 客戶端
- **首次發布** 2011年左右
- **WebSocket 支援** 2013年左右加入
- **瀏覽器支援** 2014年開始支援瀏覽器環境

#### 2. **Paho JavaScript Client**
- **發布** 2013年由 Eclipse Foundation
- 專門為瀏覽器設計的 MQTT over WebSocket

#### 3. **現代發展**
- **2015年後** Promise 支援開始普及
- **2017年後** async/await 支援
- **2018年後** MQTT 5.0 支援

## 技術演進的關係

### 早期2011-2014
```javascript
// 只有 callback 方式
mqttClient.publish(topic, message, function(error) {
    if (error) {
        console.error(error);
    }
});
```

### Promise 時代2015-2016
```javascript
// Promise 包裝
function publishMessage(topic, message) {
    return new Promise((resolve, reject) => {
        mqttClient.publish(topic, message, function(error) {
            if (error) {
                reject(error);
            } else {
                resolve();
            }
        });
    });
}
```

### 現代2017年後
```javascript
// async/await 語法
async function sendCommand() {
    try {
        await publishMessage(topic, message);
        console.log('發送成功');
    } catch (error) {
        console.error('發送失敗:', error);
    }
}
```

## 重要時間點總結

- **2011** JavaScript MQTT 客戶端出現
- **2013** MQTT over WebSocket 讓瀏覽器可以直接使用 MQTT
- **2015** Promise 讓異步程式碼更易讀
- **2017** async/await 讓異步程式碼看起來像同步程式碼
- **2019** MQTT 5.0 帶來更多功能

所以你現在學習的 callback 方式其實是最**經典****相容性最好**的寫法在所有環境都能正常運作現代的 MQTT 函式庫通常同時支援 callbackPromise  async/await 三種方式