在结束函数节点之前获取结果

时间:2017-09-08 13:29:33

标签: node.js asynchronous

在我的功能结束之前我无法达到我的价值..我尝试了回调,但它似乎不起作用..

{{1}}

提前多多感谢

1 个答案:

答案 0 :(得分:0)

我根据您的代码编写了一个独立的示例:

var http = require('http'),
    https = require('https');

http.createServer(function(req, res) {
    // You can largely ignore the code above this line, it's
    // effectively the same as yours but changed to a standalone
    // example. The important thing is we're in a function with
    // arguments called req and res.
    var url = 'https://api.coindesk.com/v1/bpi/currentprice.json';

    var request = https.get(url, function(response) {
        var body = '';

        response.on('data', function(chunk) {
            body += chunk;
        });

        response.on('end', function() {
            // TODO: handle JSON parsing errors
            var btcValue = JSON.parse(body);

            res.setHeader('Content-Type', 'application/json');

            res.end(JSON.stringify({
                btcValue: btcValue
            }));
        });
    });

    request.on('error', function(e) {
        console.error(e);
    });

    // Runs this example on port 8000
}).listen(8000);

最重要的变化是将处理我们的响应(res)的代码移动到coindesk响应的'end'侦听器中。对coindesk的调用是异步的,因此在我们尝试对其进行操作之前,我们必须等待'end'事件。

在构建JSON时,您引用了两次名为response的变量。您的代码没有定义response,但我认为它应该与调用coindesk的btcValue相关联。我不确定你想要什么,所以我只是将btcValue包裹在另一个对象中以供演示。

在您的原始代码中,您有这一行:

require('https').get(url, function(res, btcValue){

你称之为btcValue的第二个论点并不存在,所以它只会设置为undefined

我已将send更改为end,但这并不是一个重大变化。我假设您正在使用Express(提供send方法)而我的例子不是。