2016-06-28 94 views
-2

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

我已经在这里检查过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); 
+2

不可能。使用回调或承诺 –

+0

您可以编辑我的代码吗?我很急。 如果可能的话,任何指向类似exmaple的链接都会很棒 –

+0

如果你**必须**,那么你可以使用'sync-request' npm模块 - https://github.com/ForbesLindesay/sync-request它是API基本上就是标准的'request'模块,但它同步工作,你直接通过赋值得到结果。 –

回答

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都具有此行为。

总结:你要么误解了这个问题,或者别人问你这个问题有目的地试图让你来的结论是,你想要什么是不可能的(或者,当然,不推荐)

+0

嘿Dan谢谢你的回复。实际上,我希望在函数外部使用'op'数组,以便我可以使用这些数据与其他数组进行比较并执行其他操作。 但是有了这段代码,它并没有发生。我觉得我很困惑,我的问题很混乱。 –

+1

你不能那样做。您将无法访问该回调之外的“op”数组的元素,因为它们只有在调用回调之后才会被填充。你想要的是使用像'async'这样的控制流库或者使用promise。 –

+0

Ok Dan明白了。最后一个问题,我如何在请求中添加标题?我需要和uri一起传递授权标题。 –