i在我的nodejs中具有以下功能,使用express。
function metaInfo (id){
var dir = 'files/'+id;
var count = 0
fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) {
if (err) throw err;
obj = JSON.parse(data);
var myArr = obj.nodes;
var count = Object.keys(myArr).length;
console.log("counting :", count)
});
return count
};
当我调用此功能时,count
为零,但是,它是fs.readFile
内的正确值。如何返回count
的更新值?
作为fs.ReadFile是异步的,您需要使用回调或承诺。
回调:
function metaInfo (id, cb){
var dir = 'files/'+id;
var count = 0
fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) {
if (err) cb(err);
obj = JSON.parse(data);
var myArr = obj.nodes;
var count = Object.keys(myArr).length;
console.log("counting :", count)
cb(null, count)
});
};
您像这样使用它:
metaInfo(1, function(err, result) {
if(err) throw err;
console.log('Count:', result);
});
有承诺:
function metaInfo (id){
return new Promise(function(resolve, reject) {
var dir = 'files/'+id;
var count = 0
fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) {
if (err) reject(err);
obj = JSON.parse(data);
var myArr = obj.nodes;
var count = Object.keys(myArr).length;
console.log("counting :", count);
resolve(count);
});
});
};
您会这样使用它:
metaInfo(1)
.then(function(count) { console.log('Count:', count);
.catch(function(error) { throw error; };
(请参阅https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/promise(
您还可以使用FS模块的ReadFileSync方法(https://nodejs.org/api/fs.html#fs_fs_fs_fs_readfilesync_file_options(
或异步/等待,但要注意兼容性(https://developer.mozilla.org/en-us/docs/web/javascript/reference/reference/statement/statement/ashync_function(
fs.readFile
是一个异步函数,因此当您的功能返回count
时,该文件尚未打开。
这是您可以做的:
function metaInfo (id, callback){
var dir = 'files/'+id;
var count = 0
fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) {
if (err) throw err;
obj = JSON.parse(data);
var myArr = obj.nodes;
count = Object.keys(myArr).length;
callback(count);
});
};
metaInfo("yourId", function(count) {
// Here is your count
});
或
使用fs.readFileSync
这是一个很好的例子
希望它有帮助,
最好的问候,
这是您的代码的异步问题。
您应该将" async"库用于nodejs。异步文档
对于典范,您可以包装:
fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) {
if (err) throw err;
obj = JSON.parse(data);
var myArr = obj.nodes;
var count = Object.keys(myArr).length;
console.log("counting :", count)
});
to:
async.waterfall([
function(callback) {
fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) {
if (err) throw err;
obj = JSON.parse(data);
var myArr = obj.nodes;
var count = Object.keys(myArr).length;
console.log("counting :", count);
callback(null, count);
});
}
], function (err, result) {
// result now equals = count
return result;
});
fs.ReadFile是一个异步调用。
您可以将函数用作回调并调用AD AD在异步调用的末端,也可以将您的呼叫包装在Promise
中var Promise = require('bluebird');
var MyReadFileAsync = function (filename) {
return new Promise(function (resolve, reject) {
fs.readFile(filename, 'utf8', function (err,
data) {
if (err) reject(err);
obj = JSON.parse(data);
var myArr = obj.nodes;
resolve(Object.keys(myArr).length);
});
});
};
MyReadFileAsync(__dirname +'/' + dir+'/myfile.json').then(function(counter){
var myCounterUpdated = counter;
})