2016-06-27 157 views
-1

這是一個不同的問題,我無法爲此獲得解決方案,請不要將其標記爲重複。如何使用nodejs異步模塊?

我無法在函數外部訪問變量op。我應該使用nodjes的異步模塊嗎? 我有兩個console.logs。但只有在函數日誌裏纔有效。

我試過其他問題的答案。它仍然是不工作

var http = require('http'); 
console.log("hi") 
var options = { 
    host: 'api.usergrid.com', 
    path: '/siddharth1/sandbox/restaurants' 
}; 
var op = []; //declaring outside function 
var req = http.get(options, function(res) { 

    // Buffer the body entirely for processing as a whole. 
    var bodyChunks = []; 
    res.on('data', function(chunk) { 
     // You can process streamed parts here... 
     bodyChunks.push(chunk); 
    }).on('end', function() { 
     var body = Buffer.concat(bodyChunks); 

     // ...and/or process the entire body here. 
     var body2 = JSON.parse(body); 

     op = body2.entities.map(function(item) { 
      return item.name; 
     }); 
     console.log(op); // only this works 
    }) 
}); 

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


console.log("outside function " + op); //this doesnt work 


console.log('Server listening on port 80'); 
+1

不起作用的console.log不起作用,因爲它在從服務器返回回調之前執行得很好。這裏真正的問題是爲什麼你需要看看回調之外的價值?在討論使用異步之前,先回答一下。 –

回答

0

Node.js的實例變量的運算作爲一個空數組:

var op = []; //declaring outside function 

它然後調用HTTP模塊的獲得()函數,並將其傳遞options和一個回調函數。

var req = http.get(options, function(res) { 
    ... 
}); 

回調函數中的代碼是不直到 HTTP GET請求是由應用程序接收到的執行。

節點然後繼續,並執行代碼的其餘部分:

console.log("outside function " + op); //this doesnt work 

上面一行被執行,確實,OP是你定義它是一個空數組空數組 - 而不是還沒有修改'op'。

服務器然後空閒,等待任何傳入的HTTP請求。

很久以後,您當然會向您的服務器發出HTTP GET請求。您註冊的回調函數被調用,並且該函數內的代碼執行。

如果我是你,我會研究Node.js的一些基礎教程,特別是研究它的非阻塞模型。祝你好運。

注意:Ryan Dahl's original node.js presentation是一個相當長的視頻和有點舊,但完美地解釋了Node.js的工作方式,我強烈建議你給它一個手錶。

+0

謝謝你詳細解釋。我一定會看看。不幸的是,我不得不在明天展示我的代碼,我對此感到震驚:(現在試圖找到一個猴子補丁。 –