模块异步函数中的变量范围

时间:2015-03-21 00:27:58

标签: javascript node.js asynchronous

这是我在节点的第一周,所以如果这不是一个没脑子的人,我很抱歉。

代码可以正常运行。但我无法弄清楚如何匹配启动http.get whit的名称(url)从网站获得的结果。

我发现这个女巫几乎就像我的问题,除了这是一个预制功能,所以我无法编辑功能并添加回调。

variable scope in asynchronous function

如果我可以运行此代码同步或在http.get函数中进行回调,那么一切都会好的。但我没有技能,也不知道你是否能做到。

由于 - 罗宾。

http = require('http');
function download(name) {
//name is an array whit csgo items names.
for (var i = 0; i < name.length; i++) {

    var marketHashName = getGoodName(name[i]);
    var url = 'http://steamcommunity.com/market/priceoverview/?currency=1&appid=730&market_hash_name=' + marketHashName;

    http.get(url, function (res) {
        var data = "";
        res.on('data', function (chunk) {
            data += chunk;
        });
        res.on("end", function () {

            data = JSON.parse(data);
            var value= 0;
            //get the value in the json array
            if(data.median_price) {
                value = data.median_price;
            }else{
                value = data.lowest_price;
            }

            value = value.substr(5);
            console.log("WEAPON",value);
            //callback whit name/link and value?
            //callback(name,value);
        });
    }).on("error", function () {

    });
}

}

1 个答案:

答案 0 :(得分:1)

您只需添加一个回调参数,然后使用最终数据调用它。并且,如果要将正在处理的特定marketHashName传递回回调,那么您可以创建一个闭包,以便通过for循环每次捕获唯一的闭包:

http = require('http');

function download(name, callback) {
    //name is an array whit csgo items names.
    for (var i = 0; i < name.length; i++) {

        var marketHashName = getGoodName(name[i]);
        // create closure to capture marketHashName uniquely for each 
        // iteration of the for loop
        (function(theName) {
            var url = 'http://steamcommunity.com/market/priceoverview/?currency=1&appid=730&market_hash_name=' + marketHashName;

            http.get(url, function (res) {
                var data = "";
                res.on('data', function (chunk) {
                    data += chunk;
                });
                res.on("end", function () {

                    data = JSON.parse(data);
                    var value= 0;
                    //get the value in the json array
                    if(data.median_price) {
                        value = data.median_price;
                    }else{
                        value = data.lowest_price;
                    }

                    value = value.substr(5);
                    console.log("WEAPON",value);

                    // now that the async function is done, call the callback
                    // and pass it our results
                    callback(theName, value, data);
                });
            }).on("error", function () {

            });
        })(marketHasName);
    }
}

// sample usage:
download("whatever", function(name, value, data) {
   // put your code here to use the results
});

仅供参考,您可能会发现在request模块之上的http模块是更高级别的功能集将为您节省一些工作。