2016-06-28 125 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一起傳遞授權標題。 –