【问题标题】:Getting API data via asynch-await instead of callback通过 async-await 而不是回调获取 API 数据
【发布时间】:2026-01-12 14:10:01
【问题描述】:

我正在尝试通过 kraken-node api 代码获取数据。

我尝试了以下方法:

import KrakenClient from "kraken-api";
const knex = require('knex')(require('../knexfile'))
const kraken = new KrakenClient();

//*********************
//ASYNCH AWAIT EXAMPLE*
//*********************

const tickerAsynch = async function() {
    // Get Ticker Info
    return kraken.api('Ticker', { pair: 'XXBTZUSD' });
};
tickerAsynch().then(data => console.log(data)).catch(err => console.log(err))

//*****************
//CALLBACK EXAMPLE*
//*****************
// Get Ticker Info 

const tickerCallback = function() {
    kraken.api('Ticker', { "pair": 'XXBTZUSD' }, function(error, data) {
        if (error) {
            console.log(error);
        }
        else {
            console.log(data.result);
        }
    })
};

console.log("Callback: " + tickerCallback())

ASYNCH AWAIT EXAMPLE 只是将 http 请求返回给我:

回调:未定义请求{域:空,_events:{错误: [功能:绑定], 完成:[功能:绑定], 管道:[功能]},_eventsCount:3,_maxListeners:未定义,方法:'POST',标题:{'User-Agent':'Kraken Javascript API 客户端', 主机:'api.kraken.com', “内容类型”:“应用程序/x-www-form-urlencoded”, 'content-length': 13 }, timeout: 5000, callback: [Function], readable: true, writable: true, explicitMethod: true, _qs:
请求参数 { 要求:[通函], lib:{格式:[对象],解析:[功能],字符串化:[功能]}, 使用查询字符串:未定义, 解析选项:{}, stringifyOptions: { 格式: 'RFC3986' } }, _auth: Auth { 要求:[通函], hasAuth: 假的, 发送验证:假, 承载令牌:空, 用户:空, pass: null }, _oauth: OAuth { request: [Circular], params: null }, _multipart: Multipart { 要求:[通函], 边界:'839beaf0-e37d-459b-a879-0d1e2b22aab4', 分块:假, 正文:空},_redirect:重定向{ 要求:[通函], 跟随重定向:真, 跟随重定向:真, 跟随所有重定向:假, followOriginalHttpMethod: false, 允许重定向:[功能], 最大重定向:10, 重定向:[], 重定向跟随:0, removeRefererHeader: false }, _tunnel: 隧道 { 要求:[通函], 代理标头白名单: [ '接受', '接受字符集', '接受编码', '接受语言', '接受范围', '缓存控制', '内容编码', '内容语言', '内容位置', '内容-md5', '内容范围', '内容类型', '联系', '日期', '预计', '最大前锋', '语用', '推荐人', 'te', '用户代理', '通过' ], proxyHeaderExclusiveList: [] }, setHeader: [Function], hasHeader: [Function], getHeader: [Function], removeHeader: [Function], localAddress: undefined, pool: {}, dests: [],
__isRequestRequest: true, _callback: [Function], uri: Url { 协议:'https:', 斜线:真, 身份验证:空, 主机:'api.kraken.com', 端口:443, 主机名:'api.kraken.com', 哈希:空, 搜索:空, 查询:空, 路径名:'/0/public/Ticker', 路径:'/0/public/Ticker', href:'https://api.kraken.com/0/public/Ticker'},代理:null,隧道:true,setHost:true,originalCookieHeader:未定义,
_disableCookies: true, jar: undefined, port: 443, host: 'api.kraken.com', body: 'pair=XXBTZUSD', path: '/0/public/Ticker', httpModule: { Server: { [Function: Server] super: [Object] }, createServer:[功能:createServer], 全球代理: 代理人 { 域:空, _events:[对象], _eventsCount:1, _maxListeners:未定义, 默认端口:443, 协议:'https:', 选项:[对象], 要求: {}, 套接字:{}, 免费套接字:{}, keepAliveMsecs:1000, 保活:假, maxSockets:无穷大, maxFreeSockets:256, 最大缓存会话数:100, sessionCache: [对象] }, Agent: { [Function: Agent] super: [Object] }, 请求:[功能:请求], 获取:[功能:获取] },代理类:{ [功能:代理] super_: { [Function: Agent] super_: [Object], defaultMaxSockets: Infinity } }, agent: Agent { 域:空, _events:{免费:[功能]}, _eventsCount:1, _maxListeners:未定义, 默认端口:443, 协议:'https:', 选项:{路径:空}, 要求: {}, 套接字:{}, 免费套接字:{}, keepAliveMsecs:1000, 保活:假, maxSockets:无穷大, maxFreeSockets:256, 最大缓存会话数:100, _sessionCache:{地图:{},列表:[]}}}

而我通过回调示例得到价格返回:

{ XXBTZUSD: 
   { a: [ '4347.99900', '1', '1.000' ],
     b: [ '4345.00000', '1', '1.000' ],
     c: [ '4354.97000', '0.19747745' ],
     v: [ '74.25674323', '10944.61634833' ],
     p: [ '4391.05837', '4290.88239' ],
     t: [ 314, 31776 ],
     l: [ '4264.00000', '4082.99500' ],
     h: [ '4468.00000', '4484.29000' ],
     o: '4349.98700' } }

在我的 asynch-await 示例中我做错了什么有什么建议吗?

感谢您的回复!

【问题讨论】:

  • 您使用的是哪个版本的 kraken-api?

标签: javascript node.js


【解决方案1】:

我认为 kraken.api 需要一个回调并且不返回一个承诺,你总是可以使用下面的代码用一个承诺包装一个回调

function getKrakenPromise(){
  return new Promise(function(resolve, reject){
            kraken.api('Ticker', { "pair": 'XXBTZUSD' }, function(error, data) {
            if (error) {
                console.log(error);
                reject(error)
            }
            else {
                console.log(data.result);
                resolve(data);
            }
        })
  })
}

然后调用 getKrakenPromise() 而不是 api

【讨论】:

  • 只想添加“从 1.0.0 版开始:所有方法都返回一个承诺。”
  • 回调适用于 OP,因此用承诺包装它应该适用于他