由于非阻塞性质,Nodejs http请求NULL

时间:2014-02-20 07:22:02

标签: javascript node.js http

//处理来自客户端的get请求

app.get('/watch', function(req, res) {
    //A for loop goes here which makes multiple requests to an external API and stores the result in a variable data
    console.log(data); //Gives an empty value!!
    res.write(data); //Sends an empty value
}

现在,当我尝试在循环期间记录数据变量时,它的值是预期的。但是,它将数据作为空变量发送到客户端。我很确定这是因为for循环需要一段时间才能执行,而非阻塞的Node会移动到代码的下一部分。有没有针对此的解决方法,或者我的代码设计出现了根本性的错误?

编辑:按要求发布for循环

for(var num in data.items)
    {
        url ='/Product';
        options={
            host:"api.xyz.com",
            path:url
        };

        http.get(options,function(response){
            var responseData = "";
            response.setEncoding('utf8');
            //stream the data into the response
            response.on('data', function (chunk) {
                responseData+=chunk.toString();
            });
            //responseData=JSON.parse(responseData);
            //write the data at the end
            response.on('end', function(){

                body=JSON.parse(responseData);
                var discount=body.product[0].styles[0].percentOff.replace('%','');

                if(discount>=20)
                {
                    discounted_json.disc_items.push({"percentOff":discount});
                }

            });
        });
    }

1 个答案:

答案 0 :(得分:0)

当你想按顺序调用多个异步函数时,你应该调用第一个,调用它的回调中的下一个,依此类推。代码看起来像:

asyncFunction1(args, function () {
  asyncFunction2(args, function () {
    asyncFunction3(args, function () {
      // ...
    })
  })
});

使用这种方法,您最终可能会遇到难以维护的丑陋代码。

有多种方法可以在不嵌套回调的情况下实现相同的功能,例如使用async.jsnode-fibers