Получить количество открытых ордеров по символу с помощью API Binance Node.js

Я использую API Binance Node.js. В нем говорится о получении открытых ордеров для символа, я должен сделать:

binance.openOrders("ETHBTC", (error, openOrders, symbol) => {
  console.info("openOrders("+symbol+")", openOrders);
});

Чтобы распечатать количество открытых ордеров, я делаю:

binance.openOrders("ETHBTC", (error, openOrders, symbol) => {
  console.info(openOrders.length);
});

который работает, и номер распечатывается. Однако мне нужно, чтобы этот результат был сохранен в переменной, которая может использоваться позже другими функциями. Основываясь на чате SO на Javascript, я делаю следующее:

let OO =
(async() => {
  const openOrders = await binance.openOrders(false);
  return openOrders.length
})()
console.log(OO)

Однако это печатает

Promise { <pending> }

Только.

Я видел несколько других вопросов, обсуждающих проблему Promise { <pending> }, но я не смог реализовать их решения для этого конкретного случая.

Как получить количество открытых ордеров в переменную, доступную другим функциям?


person zabop    schedule 21.03.2021    source источник


Ответы (1)


Вам нужно будет использовать либо полностью асинхронный подход, либо использовать обратные вызовы.

Последний блок в вашем вопросе показывает, что объясняет этот ответ. Javascript не ждет разрешения/отклонения Promise в синхронном контексте. Таким образом, ваш асинхронный блок вернул неразрешенный Promise, а остальная часть вашего (синхронного) кода не ждала его разрешения.

Пример использования асинхронных функций

const getOpenOrdersCount = async () => {
    const openOrders = await binance.openOrders("ETHBTC");
    return openOrders.length;
};

const run = async () => {
    const openOrdersCount = await getOpenOrdersCount();
    console.log(openOrdersCount);
}

Примечание. await можно использовать только в async функциях.

Примером использования обратных вызовов является ваш код. Они полезны в небольшом масштабе, но в более широком масштабе они становятся беспорядочными и превращаются в ад обратного вызова. Поэтому я бы не рекомендовал использовать обратные вызовы в большей области.

binance.openOrders("ETHBTC", (error, openOrders, symbol) => {
  console.info(openOrders.length);

  // here goes rest of your code that needs to use the `openOrders` variable
});
person Petr Hejda    schedule 21.03.2021