与node.js同步HTTPS GET

时间:2014-03-31 04:49:02

标签: javascript node.js https

所以我正在尝试使用https GET预先形成node.js并且我有以下代码

function get(url) {
    https.request(url, function(res) {
        var data = "";
        res.on('data', function (chunk) {
            data += chunk;
        })
        .on('end', function(){
            console.log(JSON.parse(data)); 
        });

    }).on('error', function(e) {
        console.log(e.message);
    }).end();
}

除了我需要这个函数来返回其记录的数据

之外,这段代码工作得很好

我知道推荐的方法是使用回调,将回调函数传递给get,然后在'end'侦听器中调用该函数。但问题是这个过程需要同步而不是流水线,因为它会导致数据危害并占用太多内存。最重要的是,它是递归调用的,只是尝试和管理的一个大问题。

基本上,我在return JSON.parse(data)函数中尝试get,然后调用end侦听器,这可能吗?

2 个答案:

答案 0 :(得分:0)

您无法使用异步函数同步返回数据以检索数据。您的get()功能会在https.request()完成之前很久才会返回,因此您无法按照要求执行操作。

解决此问题的常用设计模式包括将回调函数传递给将在数据可用时调用的get()函数。这将涉及重构函数的调用者以通过回调函数处理异步响应。

在如何构建回调方面有一些不同的选择,但这是一般的想法:

function get(url, callback) {
    https.request(url, function(res) {
        var data = "";
        res.on('data', function (chunk) {
            data += chunk;
        })
        .on('end', function(){
            callback("success", JSON.parse(data));
        });

    }).on('error', function(e) {
        callback("error", e);
    }).end();
}

用法:

get("http://www.example.com/myurl", function(status, data) {
    if (status === "success") {
        console.log(data);
    }
});

答案 1 :(得分:0)

我可以推荐Q。它专门用于帮助您在JavaScript中对抗着名的回调金字塔。我知道回调可能会导致代码不太可读,但您不应该尝试进行同步获取请求。它有点挫败node.js的优点。

你可以转换

step1(function (value1) {
    step2(value1, function(value2) {
        step3(value2, function(value3) {
            step4(value3, function(value4) {
                // Do something with value4
            });
        });
    });
});

到此 - >

Q.fcall(promisedStep1)
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
    // Do something with value4
})
.catch(function (error) {
    // Handle any error from all above steps
})
.done();