Skip to content

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

Open

Description

@allawitte

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]));
  }
});

Activity

  1. shama commented on Sep 26, 2018

    @shama
    Owner

    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 */ })
  2. allawitte commented on Sep 26, 2018

    @allawitte
    Author
  3. shama commented on Sep 26, 2018

    @shama
    Owner

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions