2016-11-23 28 views
3

在服務器端我有這樣的事情:如何發出Map對象

const users = new Map(); 
users.set('id', { name: 'name' }); 
// ... 

// then I emit: 
io.emit('user_change', users); 

在客戶端我有類似:

socket.on('user_change', users => { 
    for (let user of users) { 
     userlist.append(`<li>${user.name}</li>`); 
    } 
}); 

users是空的({})。

如何發出Map對象?

回答

1

socket.io(或任何傳輸機制)可能使用JSON作爲序列化格式。不幸的是,地圖和集合以及其他ES2015數據類型不能被JSON編碼。

let m = new Map([['one', 1], ['ten', 10], ['hundred', 100]]); 
console.log(JSON.stringify(m)); 
// "{}" 

這是非常不雅,但我轉換成一個陣列的陣列的服務器端,傳輸的是,並重新創建客戶端上的地圖:

let transitString = JSON.stringify(Array.from(m)); 
console.log(transitString) 
// "[["one",1],["ten",10],["hundred",100]]" 
var newMap = new Map(JSON.parse(transitString)); 
console.log(newMap) 
// Map {"one" => 1, "ten" => 10, "hundred" => 100} 

所以你的情況,我'd在服務器上執行io.emit('user_change', Array.from(users));,並在客戶端上更改for循環以使用映射:for (let user of (new Map(users)))

相關問題