【问题标题】:Getting real time data from API into route从 API 获取实时数据到路由
【发布时间】:2017-11-05 13:09:32
【问题描述】:

我正在使用以下两个文件从两个 API 获取数据。请在下面找到我的最小可行示例:

poloniex.js

const Poloniex = require('poloniex-api-node')
const poloniex = new Poloniex()

async function getExchangeTicker() {
  poloniex.returnTicker((err, ticker) => {
    if (err) {
      console.log(err.message)
    } else {
      //console.log(ticker)
      return ticker
    }
  })
}

module.exports = {
  getExchangeTicker,
}

cctx.js

const ccxt = require ('ccxt')

async function getExchangeTicker() {
  const bitfinex = new ccxt.bitfinex({ verbose: true })  
  const data = await bitfinex.fetchTicker()
  return data
}

module.exports = {
  getExchangeTicker,
}

scheduler.js

const exchangePoloniex = require('../exchange/poloniex')
const exchangeCCTX = require('../exchange/cctx')

async function getAllTickers() {
  const exchanges = [
    exchangePoloniex,
    exchangeCCTX,
  ]

  let res
  exchanges.forEach((exchange) => {
    res = exchange.getExchangeTicker()
  })
  return res
}

async function runScheduler() {
  let res
  setInterval(() => {
    this.res = getAllTickers()
  }, 3000)
  console.log("res: " + res)
  return res
}

runScheduler()

我正在运行一个调度程序来汇集这些文件中的数据,但只能返回 res: undefined

有什么建议可以正确地从这两个 API 中获取数据吗?

非常感谢您的回复!

【问题讨论】:

  • runScheduler 中,您的console.log 在第一个setInterval 之前运行3 秒。也许res 越来越多,而您只是不知道。你打算用它做什么?
  • 另外,你所有的分号在哪里?它可能会运行,但我觉得将它们全部排除在外是自找麻烦!
  • @arbuthnott 我基本上想要来自这两个 API 的数据。关于; -> eslint airbnb
  • 我认为 setInterval 是我没有得到的 - 你想要来自 API 的数据来响应浏览器请求吗?存储在内存中的变量中?用于更新数据库...?
  • @arbuthnott 基本上我想在数据库中更新它并在浏览器请求中使用它

标签: javascript node.js ccxt


【解决方案1】:

我不知道您正在访问的两个 API,因此我无法真正判断您来自 poloniex.js 或 cctx.js 的代码是否良好 - 我假设您可以通过 console.logs 等告诉您您分别从每个获取您需要的 API 数据。

但我可以在您的 scheduler.js 文件中看到一些逻辑问题:

  1. getAllTickers 中,您的.forEach 循环每次迭代都会覆盖res,因此只有最后一个结果可见。
  2. 因为它是一个async 函数,所以getAllTickers 返回一个promise。您需要在返回的内容上使用 .then 或类似名称。
  3. runScheduler 中的 console.log 和 return 在 setInterval 有机会执行之前完成,即使执行一次,因此没有可用的数据。

我认为以下设置可能是您想要的:

const exchangePoloniex = require('../exchange/poloniex')
const exchangeCCTX = require('../exchange/cctx')

async function getAllTickers() {

  let updatedTickers = []
  updatedTickers[0] = await exchangePoloniex.getExchangeTicker()
  updatedTickers[1] = await exchangeCCTX.getExchangeTicker()

  return updatedTickers
}

function runScheduler() {
  let tickers
  setInterval(() => {
    tickers = getAllTickers()
    console.log(tickers) // tickers is a promise at this point

    tickers.then((data) => {
        console.log(data) // should be the data returned from your apis
        // store the data in your db
    })
  }, 3000)
}

runScheduler()

注意runScheduler 不必是异步的,因为你没有对返回值做任何事情——所有的工作都在setInterval 回调中

如果您需要提供此数据以响应浏览器请求,则可以从您的数据库中获取它,知道它已在过去 3 秒内更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多