通过 async-await 而不是回调获取 API 数据

Posted

技术标签:

【中文标题】通过 async-await 而不是回调获取 API 数据【英文标题】:Getting API data via asynch-await instead of callback 【发布时间】:2018-01-23 03:44:23 【问题描述】:

我正在尝试通过 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? 【参考方案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,因此用承诺包装它应该适用于他

以上是关于通过 async-await 而不是回调获取 API 数据的主要内容,如果未能解决你的问题,请参考以下文章

功能推送的异步/等待不起作用[重复]

Async-Await:即使一个错误,如何在多个等待调用中获取数据?

JS异步编程,3/3,async-await,generator,eventloop

获取interactivePopGestureRecognizer会解除回调/事件

Callback Promise Generator Async-Await 和异常处理的演进

如何从 InputStream 而不是 File 中获取 Exif 数据?