javascript - Node JS : Returning Data with Callback Function from API using http

标签 javascript node.js callback httprequest

我开始学习 Node.js,我正在尝试使用 Express 框架构建一个应用程序,该应用程序将查询 Coinbase API 并获取有关比特币价格的数据。

虽然我一直在努力解决一件事,但因为我是 Node 上的回调函数的新手,所以它没有帮助。

我能够完全查询 API 并获取数据,但是当以某种方式返回价格时,它总是返回为“未定义”。

我之前在使用不使用回调的简单查询时遇到过这个问题,所以我认为这是与缺少回调有关。但是,我现在仍然遇到同样的问题,并且我已经尝试了很多次迭代。我似乎找不到解决办法。任何帮助,将不胜感激。

var url = 'https://api.coinbase.com/v2/prices/spot?currency=USD';

function makeCall (url, callback) {
    https.get(url,function (res) {
        res.on('data', function (d) {
            callback(JSON.parse(d));
        });
        res.on('error', function (e) {
            console.error(e);
        });
    });
}

function handleResults(results){
    return Number((results.data.amount))*14.5;
}

console.log(makeCall(url, function(results){
	handleResults(results);      
}));

最佳答案

makeCall() 实际上并没有返回任何东西。所以当你打电话时:

console.log(makeCall(url, function(results){
    handleResults(results);      
}));

您正在将 makeCall() 的立即返回值(未定义)写入控制台。 handleResults() 的返回发生得太晚,console.log() 无法获取。

这需要一点时间来适应。但是你需要确保当你需要一个来自异步回调的值时,你等待访问它。例如,这会起作用:

function handleResults(results){
    console.log(Number((results.data.amount))*14.5;)
}

学习使用 promises 可以使其中的一些内容更直观、更易于阅读。

使用 promises 你可以这样写:

const https = require('https')
var url = 'https://api.coinbase.com/v2/prices/spot?currency=USD';

function makeCall (url) {
    return new Promise((resolve, reject) => {
        https.get(url,function (res) {
            res.on('data', function (d) {
                resolve(JSON.parse(d));
            });
            res.on('error', function (e) {
                reject(e)
            });
        });
    })

}

function handleResults(results){
    return Number((results.data.amount))*14.5;
}

makeCall(url)
.then(function(results){
    console.log(handleResults(results))
})
.catch(console.log)

关于javascript - Node JS : Returning Data with Callback Function from API using http,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47242739/

相关文章:

javascript - 如何强制函数连续执行?

javascript - 将函数传递给 d3 的 .data()

matlab - 以编程方式保存可编辑的 uitable 的更改

javascript - 如何根据属性在类中的位置获取元素的具体名称

javascript - 如何使用 angularjs 正确格式化表中的 JSON 数据?

javascript - 如何在 ejs 文件中使用外部 javascript 文件

javascript - 让基本的 socket.io 示例工作

node.js - nunjucks:找不到模板

javascript - 如何减少react-chart-js2中显示的数据点数(数据抽取)

c# - 将用户生成的内容添加到 asp.net 中的数据库