【问题标题】:Node JS: Returning Data with Callback Function from API using httpNode JS:使用http从API返回带有回调函数的数据
【发布时间】:2017-11-11 21:01:41
【问题描述】:

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

不过,我一直在为一件事苦苦挣扎,因为我对节点上的回调函数不熟悉,所以它没有帮助。

我能够完全查询 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);      
}));

【问题讨论】:

    标签: javascript node.js callback httprequest


    【解决方案1】:

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

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

    您正在将makeCall()(即undefined)的立即返回值写入控制台。 handleResults() 的返回对于 console.log() 来说太晚了。

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

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

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

    使用 Promise 你可以这样写:

    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)
    

    【讨论】:

    • 非常感谢@Mark_M 的建议。将尝试向我们承诺前进,因为这似乎是一个受欢迎的选择。我只是在代码中苦苦挣扎,因为我需要将价格作为数字返回。例如,我想将其保存为变量,以便我可以对价格进行其他计算。例如,我想将 makeCall API 调用中的 results.data.amount 设置为某个变量,比如返回的“价格”?
    • 我听到了,一开始很困惑。您通常不能从回调中返回内容并期望它们工作,因为在某些时候您会到达已经运行的原始函数。您需要将异步值传递给其他回调或使用承诺。
    猜你喜欢
    • 2020-04-22
    • 2018-06-30
    • 1970-01-01
    • 2022-11-04
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    相关资源
    最近更新 更多