2016-07-16 45 views
0

我正在使用從JSON文件訪問數據,然後查詢該文件以查找特定鍵的函數。我試圖返回它的發現,但似乎在查詢找到密鑰之前正在執行返回函數。從函數node.js中的對象異步阻塞返回變量

查詢後,我返回查詢函數中的變量queryresponse,它總是結束回來未定義。

var jsonQuery = require('json-query'); 
var fs = require('fs'); 

function querydb(netdomain){ 
fs.readFile('./querykeys.json', 'utf8', function (err, data) { 
    if (err){console.log('error');} 
    var obj = JSON.parse(data); 
    var queryobject = netdomain.toString(); 
    var queryresponse = jsonQuery('servers[netshare=' + queryobject + '].netdomain', { 
      data: obj 
     }); 
    return queryresponse; 



}); 

} 

console.log(querydb('timeline')); 
// returns undefined. 

我該怎麼做才能使該語句異步?

我想知道,我也試過這個,也不起作用,仍然給出未定義的響應。

var jsonQuery = require('json-query'); 
var fs = require('fs'); 

function querydb(netdomain){ 
fs.readFile('./querykeys.json', 'utf8', function (err, data) { 
    if (err){console.log('error');} 
    var obj = JSON.parse(data); 
    var queryobject = netdomain.toString(); 
    return jsonQuery('servers[netshare=' + queryobject + '].netdomain', { 
      data: obj 
     }); 




}); 

} 

console.log(querydb('timeline')); 

感謝您的幫助,您可以提供

+0

我想你必須返回jsonQuery()。值 –

+0

你的函數已經是異步的。您需要研究同步和異步之間的差異。你所要求的是一個同步結果,你不能從異步函數中獲得。閱讀所有選項的重複問題。您不能直接從異步操作返回值。您必須使用回調,承諾或其他類似技術,以便在價值準備就緒後可以通知您。 – jfriend00

回答

0

您需要使用一個回調。這樣的事情:

var jsonQuery = require('json-query'); 
var fs = require('fs'); 

function querydb(netdomain, callback) { 
    fs.readFile('./querykeys.json', 'utf8', function (err, data) { 
     if (err) { 
      callback(err); 
      return; 
     } 

     var obj = JSON.parse(data); 
     var queryobject = netdomain.toString(); 
     callback(null, jsonQuery('servers[netshare=' + queryobject + '].netdomain', { 
       data: obj 
     })); 
    }); 
} 

querydb('timeline', function (err, result) { 
    if (err) { 
     console.log('ERROR: ' + err); 
     return; 
    } 

    console.log(result); 
});