-1

I just need to write simple and clean code. But it is complicated.
How can I use promise to write more readable code

var arrangeTheOrders = (name, margin, precision, cost, minQty, interval) => {
binance.getBalances((err, balances) => {
    if (err) {
        console.log(err.body);
        return;
    } else if (balances) {
        let available = balances[name.substr(0, name.length - 3).toUpperCase()].available;
        let onOrder = balances[name.substr(0, name.length - 3).toUpperCase()].onOrder;
        let currentBalance = Number.parseFloat(available) + Number.parseFloat(onOrder);
        if (minQty > currentBalance) {
            console.log('the crypto was sold');
            return;
        } else {
            binance.getOpenOrdersByName(name, (err, openOrders) => {
                if (err) {
                    console.log(err.body);
                    return;
                } else if (openOrders) {
                    console.log(openOrders);
                }
            });
        }
    }
});

};

Star
  • 3,222
  • 5
  • 32
  • 48
  • Assuming that the code works correctly, you might want to write up your samples in a more-complete fashion and ask for critique over at [codereview.se]. Be sure to read [A guide to Code Review for Stack Overflow users](//codereview.meta.stackexchange.com/a/5778) first, as some things are done differently over there! – Toby Speight Feb 13 '18 at 09:25
  • Possible duplicate of [How do I return the response from an asynchronous call?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – HMR Feb 13 '18 at 09:59

2 Answers2

0

You can promisify (under To use a callback api as promise you can do:) the binance functions.

Code would look a bit like this:

const asPromise = object => fn => args =>
  new Promise(
    (resolve,reject)=>
      fn.apply(
        object,
        args.concat([
          (...result)=>
            (result[0])//first argument of callback is error
              ? reject(result[0])//reject with error
              : resolve(result.slice(1,result.length))//resolve with result(s)
        ])
      )
  );

const binanceAsPromise = asPromise(binance);
var arrangeTheOrders = (name, margin, precision, cost, minQty, interval) =>
  binanceAsPromise(binance.getBalances)([])
  .then(([balances]) => {
    if (balances) {
      let available = balances[name.substr(0, name.length - 3).toUpperCase()].available;
      let onOrder = balances[name.substr(0, name.length - 3).toUpperCase()].onOrder;
      let currentBalance = Number.parseFloat(available) + Number.parseFloat(onOrder);
      if (minQty > currentBalance) {
        console.log('the crypto was sold');
        return;
      } else {
        return binanceAsPromise(binance.getOpenOrdersByName)([name])
        .then(
          ([openOrders])=>console.log(openOrders)
        )            
      }
    }
  })
  .catch(
    err=>console.log("something went wrong:",err)
  )

Or if you use async await syntax it will look like this:

const binanceAsPromise = asPromise(binance);
var arrangeTheOrders = async (name, margin, precision, cost, minQty, interval) => {
  try{
    const [balances] = await binanceAsPromise(binance.getBalances)([])
    if (balances) {
      let available = balances[name.substr(0, name.length - 3).toUpperCase()].available;
      let onOrder = balances[name.substr(0, name.length - 3).toUpperCase()].onOrder;
      let currentBalance = Number.parseFloat(available) + Number.parseFloat(onOrder);
      if (minQty > currentBalance) {
        console.log('the crypto was sold');
        return;
      } else {
        const [openOrders] = await binanceAsPromise(binance.getOpenOrdersByName)([name]);
        console.log("open orders:",openOrders);
      }
    }  
  }
  catch(err){
    err=>console.log("something went wrong:",err);
  }
}
HMR
  • 37,593
  • 24
  • 91
  • 160
0

From your code it seems you are already using ES6 for your program.

I would suggest you to take advantage of same to solve your problem, solve your callback hell problem using asynch/await function.

Go through example below:

function resolveAfter2Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}


async function add1(x) {
  const a = await resolveAfter2Seconds(20);
  const b = await resolveAfter2Seconds(30);
  return x + a + b;
}

add1(10).then(v => {
  console.log(v);  // prints 60 after 4 seconds.
});

Same way you can also define your multiple functions as asynch and then call them using await keyword in whatever condition you want to call them.

For more on asynch/await please refer following links.

  1. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
  2. https://javascript.info/async-await
  3. https://scotch.io/courses/10-need-to-know-javascript-concepts/callbacks-promises-and-async
sidgujrathi
  • 479
  • 4
  • 7