首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在coinbase- node.js回调函数中使用coinbase for循环索引

在coinbase- node.js回调函数中使用coinbase for循环索引
EN

Stack Overflow用户
提问于 2020-08-21 05:48:33
回答 1查看 69关注 0票数 0

我是node.js的新手,我正在尝试编写一个简单的脚本,它将连接到coinbase-api,并获取在市场数组中定义的任何市场的当前价格。

我遇到的问题是,迭代数组的for循环是异步的,并且回调函数没有获得数组的正确索引值。

我发现的两个主要解决方案是使用promises或强制循环等待。我认为我需要使用promises,而不是强迫for循环等待,但老实说,无论哪种方式,我都没有实现解决方案。我已经找到了许诺的例子,但我似乎就是想不出如何在我的脚本中实现它们。如果有任何帮助,我将不胜感激。

代码语言:javascript
复制
const coinbaseModule = require('coinbase-pro');

const COINBASE_URI = 'https://api-public.sandbox.pro.coinbase.com';

// const MARKET = ['BTC-USD'];
const MARKET = ['BTC-USD', 'ETH-BTC'];

let askPrice = [null, null];

let averagePrice = [null, null];

let tickerCount = null;

const getCallback = (error, response, data) => 
{   
    if (error)
        return console.log(error);

    if ((data!=null) && (data.ask!=null) && (data.time!=null))
    {
        askPrice[tickerCount] = parseFloat(data.ask);
        
        if (averagePrice[tickerCount]===null)
        {
            averagePrice[tickerCount] = askPrice[tickerCount];
            console.log(MARKET[tickerCount] + " ask price: " + askPrice[tickerCount].toFixed(6));
        }
        else
        {   
            averagePrice[tickerCount] = (averagePrice[tickerCount] * 1000 + askPrice[tickerCount]) / 1001;
            console.log(MARKET[tickerCount] + " ask price: " + askPrice[tickerCount].toFixed(6) + " average price: "+ averagePrice[tickerCount].toFixed(6));
        }
    }
}

setInterval(() => 
{
    console.log('\n');
    publicClient = new coinbaseModule.PublicClient(COINBASE_URI); 

    for (tickerCount = 0; tickerCount < MARKET.length; tickerCount++) 
    {
        publicClient.getProductTicker(MARKET[tickerCount], getCallback);
    }

}, 10000);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-22 02:09:00

我能够从Mozilla开发人员网络上的有用示例中找出如何使用promises进行反复试验。我确信我犯了一些错误,但至少它现在起作用了。另一个小好处是,我能够删除一个全局变量。

代码语言:javascript
复制
const coinbaseModule = require('coinbase-pro');

const COINBASE_URI = 'https://api-public.sandbox.pro.coinbase.com';

// const MARKET = ['BTC-USD'];
const MARKET = ['BTC-USD', 'ETH-BTC'];

let askPrice = [null, null];

let averagePrice = [null, null];

function getProductTicker(tickerCount) { 
  return new Promise(resolve => {
    publicClient.getProductTicker(MARKET[tickerCount],function callback(error, response, data){
        if (error)
            return console.log(error);

        if ((data!=null) && (data.ask!=null) && (data.time!=null))
        {
            askPrice[tickerCount] = parseFloat(data.ask);
            
            if (averagePrice[tickerCount]===null)
            {
                averagePrice[tickerCount] = askPrice[tickerCount];
                console.log(MARKET[tickerCount] + " ask price: " + askPrice[tickerCount].toFixed(6));
            }
            else
            {   
                averagePrice[tickerCount] = (averagePrice[tickerCount] * 1000 + askPrice[tickerCount]) / 1001;
                console.log(MARKET[tickerCount] + " ask price: " + askPrice[tickerCount].toFixed(6) + " average price: "+ averagePrice[tickerCount].toFixed(6));
            }
        resolve();
        }
    });
  });
}

setInterval( async () => 
{
    console.log('\n');
    publicClient = new coinbaseModule.PublicClient(COINBASE_URI); 

    for (var tickerCount = 0; tickerCount < MARKET.length; tickerCount++) 
    {
        await getProductTicker(tickerCount);
    }
}, 10000);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63513576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档