2016-07-16 90 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); 
});