(js) 使用 api 包装器编写异步函数

Posted

技术标签:

【中文标题】(js) 使用 api 包装器编写异步函数【英文标题】:(js) writing async function using a api wrapper 【发布时间】:2020-08-12 05:00:15 【问题描述】:

我目前正在使用https://github.com/pixtron/bybit-api/tree/master

我想要做的看起来像这样:

const RestClient = require('@pxtrn/bybit-api');

const API_KEY = 'xxx';
const PRIVATE_KEY = 'yyy';

const client = new RestClient(API_KEY, PRIVATE_KEY);

client.getPosition(symbol: 'BTCUSD')
  .then(msg => 
    let btcPositionCheck = msg.result.size;
    if (btcPositionCheck == 0) 
      console.log("empty")
     else 
      let btcPositionSize = btcPositionCheck;
      let btcPositionSide = msg.result.side;
    
  )
  .catch(err => 
    console.error(err);
  );


client.getPosition(symbol: 'ETHUSD')
  .then(msg => 
    let ethPositionCheck = msg.result.size;
    if (ethPositionCheck == 0) 
      console.log("empty")
     else 
      let ethPositionSize = ethPositionCheck;
      let ethPositionSide = msg.result.side;
    
  )
  .catch(err => 
    console.error(err);
  );

console.log(btcPositionSize + ' ' + ethPositionSize)

返回以下错误:

ReferenceError: btcPositionSize 未定义

只是因为我超出了范围,我知道。但是,我不确定如何重写以下内容以更好地构建我需要的内容。 (我还需要为 3 个不同的资产调用 getPosition,并从每次调用中获取变量,以便稍后在我的代码中使用。)如果这有任何意义。帮助将不胜感激

编辑:

async function getPosition(symbol: BTCUSD) 
  try 
    let btcPositionCheck = msg.result.size;

   catch(error) 
    return null;
  



我正在尝试重写它,但我不确定如何

【问题讨论】:

这能回答你的问题吗? How do I return the response from an asynchronous call? 【参考方案1】:

一旦您进入异步上下文,您需要留在异步上下文中以获取值。在您的情况下,有要解决的承诺,您可以等待它们然后打印。

您还需要确保您的变量在有效范围内

const RestClient = require('@pxtrn/bybit-api');

const API_KEY = 'xxx';
const PRIVATE_KEY = 'yyy';

const client = new RestClient(API_KEY, PRIVATE_KEY);

async function doItAll() 

  let btcPositionCheck;
  let ethPositionCheck;

  await client.getPosition(symbol: 'BTCUSD')
    .then(msg => 
      btcPositionCheck = msg.result.size;
      if (btcPositionCheck == 0) 
        console.log("empty")
       else 
        let btcPositionSize = btcPositionCheck;
        let btcPositionSide = msg.result.side;
      
    )
    .catch(err => 
      console.error(err);
   );


  await client.getPosition(symbol: 'ETHUSD')
    .then(msg => 
      ethPositionCheck = msg.result.size;
      if (ethPositionCheck == 0) 
        console.log("empty")
       else 
        let ethPositionSize = ethPositionCheck;
        let ethPositionSide = msg.result.side;
      
    )
    .catch(err => 
      console.error(err);
    );

    console.log(btcPositionSize + ' ' + ethPositionSize)

请注意,更好的方法是将 await 承诺转化为值,这意味着它可以看起来像这样(要使用 await,它需要在异步函数中)

    const msg = await client.getPosition(symbol: 'BTCUSD')
    btcPositionCheck = msg.result.size;
    if (btcPositionCheck == 0) 
      console.log("empty")
     else 
      let btcPositionSize = btcPositionCheck;
      let btcPositionSide = msg.result.side;
    

【讨论】:

以上是关于(js) 使用 api 包装器编写异步函数的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js - 尝试等待异步进程并允许递归调用包装器

node.js 函数调用顺序,Spotify Web API

node js - 当函数依赖于内部的异步函数时,如何从函数返回值

有没有办法将等待/异步 try/catch 块包装到每个函数?

在代理后面使用 opensubtitles api Node.js/Python 包装器

编写一个包装器将现有的 REST API 公开为 SOAP Web 服务?