2017-06-16 15 views
0

我有這樣的設置如何我可以等的承諾在Socket.IO方面

//Client Side 


socket.emit('some_event'); 


//Server Side 


socket.on('some_event', function(data){ 
     socket.emit('another_event', getDataFromAPI()); 
}); 

的事情是,我的功能getDataFromAPI()是因爲它調用外部API,它使用的是可能需要一些時間打電話承諾。類似的東西:

function getDataFromAPI(){ 
    myAPI.getStuffFromId('123456789') 
    .then(function(data){ 
     return data; 
    }); 
} 

如果我使用這種方式,會有什麼在getDataFromAPI()中,如果我決定要打印出來,它發送null到客戶端,並打印undefined的socket.IO通話範圍。如果我將它登錄到諾言中的控制檯上,那麼我有數據,但返回它有點太晚了。

由於我將使用承諾與該API的呼叫很多,我的客戶端/服務器的大部分實時通信將通過Socket.IO進行是否有一些明顯的,我失蹤或這只是一種模式,我不應該正在使用。

+0

@JaromandaX將跳過使用它們,但我有種必然要使用它們的API包裝:( – phadaphunk

回答

3

從您的getDataFromAPI方法中退還承諾。

function getDataFromAPI(){ 
    return myAPI.getStuffFromId('123456789') 
    .then(function(data){ 
     return data; 
    }); 
} 

並且在承諾解決時發出。

io.on('connection', function(socket){ 
    socket.on('some_event', function(data){ 
     getDataFromAPI().then(function(apiData){ 
      socket.emit('another_event', apiData); 
     }) 
    }); 
}); 
+0

好吧,我才意識到我有一些讀書做...感謝了很多的工作就像一個魅力。 – phadaphunk

+0

@phadaphunk你會得到它的竅門:) – Bert