使nodejs同步调用

时间:2016-06-28 07:52:08

标签: node.js synchronous

我希望以下nodejs在最后同步运行print second console.log命令。

我在这里检查过mnay解决方案,请给我一个解决方案。

var request = require('request')
var op=[];
request({ uri: 'http://api.usergrid.com/siddharth1/sandbox/volvos/John' }, function(err, response, body){
    // use body
    //console.log(body);
    var body2 = JSON.parse(body);
         op = body2.entities.map(function(item) {
           return item.name;
         });
         console.log("inside log "+op);

})
console.log("outside log "+op);

1 个答案:

答案 0 :(得分:2)

你正试图解决错误的问题。您不希望此代码同步运行,只需在收到响应后运行console.log 即可。这很简单。

var request = require('request')
request({ uri: 'http://api.usergrid.com/siddharth1/sandbox/volvos/John' }, function(err, response, body) {
  // use body
  //console.log(body);
  var body2 = JSON.parse(body);
  var op = body2.entities.map(function(item) {
    return item.name;
  });
  console.log("log "+op);
})

强制请求是同步的并不是“节点式”,并且是非常糟糕的练习*除非你有充分的理由这样做(提示:你没有);节点是单线程的,强制请求同步会使请求阻塞,并且您将失去实际使用Node的任何好处。不要那样做。

我不确定为什么你需要两个console.logs,也许你误解了你的问题。

至于console.log调用无法request 的原因:传递给request的函数未执行立即,它将在未来的某个时刻执行,但它永远不会立即执行。这意味着在调用request之后执行的任何代码将始终在传递之前执行传递给request的函数。

这是Node的基本模式:默认情况下,所有I / O都有此行为。

总结:你要么误解了这个问题,要么问你这个问题的人是故意试图让你得出你想要的东西是不可能的(或者,当然,不推荐)