【问题标题】:How to block after http request with Node.js如何在使用 Node.js 的 http 请求后阻止
【发布时间】:2013-01-20 17:58:09
【问题描述】:

我有以下代码:

var options1 = {
  host: 'maps.googleapis.com',
  port: 80,
  path: "/maps/api/geocode/json?latlng=" + lat + "," + lng + "&sensor=false",
  method: 'GET',
  headers: {
      'Content-Type': 'application/json'
  }
};

var body1 = "";

var req = http.request(options1, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    //console.log('BODY: ' + chunk);
    body1 += chunk;
  });
  res.on('close', function () {
    console.log('get_zillow : ' + body1);
  });
});

req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});

req.end();

console.log('get_zillow : ' + body1);

我需要使用 JSON 响应的结果填充 body1。然而,第一个console.log('get_zillow : ' + body1); 永远不会被调用——由于某种原因,结果永远不会关闭——第二个console.log('get_zillow : ' + body1); 什么也不打印,因为它是异步的,并且在body1 被填充之前被调用。

另外,我需要连续多次向不同的外部站点发出类似的请求,每个请求都依赖于上一个结果中的 json。有没有什么办法可以做到这一点,而无需编写三个混乱的内部回调,并且在 http 请求后以某种方式阻塞?

【问题讨论】:

  • 每当我在一句话中听到“block”和“javascript”,我就知道答案是否定的。
  • 您无法避免回调 (AFAIK),但您可以通过按名称提供回调(而不是调用中的内联)来避免嵌套
  • 尝试'end' 而不是'close'。而且,您不能强制阻塞异步任务。但是,有flow controlpromises/futures 库可以提供帮助,例如async(尤其是async.waterfall)。
  • 你可能对这个截屏视频感兴趣,它涵盖了这种东西:nodecasts.net/episodes/5-thinking-asynchronously(完全公开,我是作者)

标签: javascript node.js


【解决方案1】:

改变

res.on('close', function () {
    console.log('get_zillow : ' + body1);
  });

res.on('end', function () {
     callback_function(body1);
});

//定义新函数

function callback_function(finaldata)
{
 // handle your final data
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2021-01-05
    • 2015-03-31
    • 2018-01-28
    • 2021-09-07
    相关资源
    最近更新 更多