shama / letswritecode

:mortar_board: code examples for Let's Write Code
https://www.youtube.com/user/kylerobinsonyoung
804 stars 759 forks source link

How to make promise from web-socket API? #21

Open allawitte opened 5 years ago

allawitte commented 5 years ago

Thank you for your video! I do application on nodejs what request some data on external server and relay them to some external client via TCP. Do you have an idea how to make promise from the code like:

const Market = require('some-api');
myMarket = new Market();
myMarket.websockets.trades(request[1], (trades, error) => {
  if (error) {
    send to external client(error);
  }
  if(this.streamStatuse === 1) {
    send to external client(JSON.stringify(['TR', this.getTimeString(), trades]));
  }
});
shama commented 5 years ago

There is a non-standard API Promise.denodeify to help convert Node.js compatible callbacks to promises but that API signature in your example doesn't match the Node.js standard of error first in callbacks.

But you can just wrap it in a promise to turn it into a promise:

const Market = require('some-api');
const promise = new Promise((resolve, reject) => {
  const myMarket = new Market();
  myMarket.websockets.trades(request[1], (trades, error) => {
    if (error) {
      reject(error);
      return;
    }
    if (this.streamStatus === 1) {
      resolve(JSON.stringify(['TR', this.getTimeString(), trades]));
    } else {
      reject(new Error('This promise wasnt handled'));
    }
  });
});

promise
  .then((json) => { /* do stuff with json */ })
  .catch((err) => { /* do stuff with err */ })
allawitte commented 5 years ago

Thank you for your answer! Yes, I also tried to write exactly this type of code in first place. And I check it now.  It works very interesting - I get an expected string in the promise.then and nothing else, when  this line: myMarket.websockets.trades(request[1], (trades, error) => {  ... } - it is websocket, I should get such lines every few seconds or milliseconds. Do you have an idea how handle it? Best, Alla

Web-site: http//allawitte.nl

 

----- Reply to message ----- Subject: Re: [shama/letswritecode] How to make promise from web-socket API? (#21) Date: 26 сентября 2018 г., 19:09:47 From: Kyle Robinson Young notifications@github.com To: shama/letswritecode letswritecode@noreply.github.com

There is a non-standard API Promise.denodeify to help convert Node.js compatible callbacks to promises but that API signature in your example doesn't match the Node.js standard of error first in callbacks.

But you can just wrap it in a promise to turn it into a promise:

const Market = require('some-api'); const promise = new Promise((resolve, reject) => { const myMarket = new Market(); myMarket.websockets.trades(request[1], (trades, error) => { if (error) { reject(error); return; } if (this.streamStatus === 1) { resolve(JSON.stringify(['TR', this.getTimeString(), trades])); } else { reject(new Error('This promise wasnt handled')); } }); });

promise .then((json) => { / do stuff with json / }) .catch((err) => { / do stuff with err / })

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.

 

shama commented 5 years ago

Ah ha, I see. If (trades, error) => {} gets called multiple times then it's effectively an Event Emitter. In which case you shouldn't use a promise here. Promises are intended to be resolved a single time so they're not a very good API for events.