readFile每次返回不同的Buffer值
readFile returning different Buffer value every time
我的应用程序从Highcharts生成缩略图以显示在UI上。每次刷新页面时,缩略图的顺序都会发生变化。
经过一些调查,我发现data
每次都是不同的缓冲区值(甚至在我将其传递到base64转换函数之前),这也导致我的fileImageArray
每次都处于不同的顺序。
我每次都将正确的files[i]
传递给readFile
,所以这不是错误。
这是我读取文件的功能:
function getFiles(callback) {
var filesNameArray = [], fileImageArray = [], base64 = "";
fs.readdir(graphDir, function(err, files) {
if (err) {
console.log(err);
} else {
for (var i in files) {
filesNameArray.push(files[i].substr(0, files[i].indexOf(".")));
fs.readFile(graphDir + files[i], function(err, data) {
if (err) {
console.log(err);
} else {
base64 = 'data:image/png;base64,' + conversions.bufferToBase64(data);
fileImageArray.push(base64);
}
});
}
callback(filesNameArray, fileImageArray);
}
});
}
感谢您的帮助。
这看起来是节点的fs
实现的已知问题。https://github.com/nodejs/node/issues/3232
如果你能负担得起阻塞IO,我建议你试试fs.readdirSync
。或者像这样对回调中的文件数组进行排序。
fs.readdir(graphDir, function(err, files) {
if (err) {
console.log(err);
} else {
// sort files
files = files.sort(function(a, b) {
return a < b ? -1 : 1;
});
for (var i in files) {
filesNameArray.push(files[i].substr(0, files[i].indexOf(".")));
fs.readFile(graphDir + files[i], function(err, data) {
if (err) {
console.log(err);
} else {
base64 = 'data:image/png;base64,' + conversions.bufferToBase64(data);
fileImageArray.push(base64);
}
});
}
callback(filesNameArray, fileImageArray);
}
});
我还建议您将for
循环切换到.forEach
以优化行为。
相关文章:
- 节点导出返回一个空对象
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 控制台返回var不是't定义,但它是
- 从函数返回角度承诺
- Javascript返回值只在循环中返回一次
- Node.js's Buffer.writeFloatBE in Javascript
- 从控制器返回后Ajax启动事件激发
- CKFinder 3为所选文件返回错误的URL
- 如何在d3.js中返回路径的y坐标
- 如何从jquery函数返回变量
- Angular js-返回一个包含类似
- JSONP请求返回结果,但也触发error_callback
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- JS验证ajax返回的html中的表单数据
- Buffer.byteLength 返回截然不同的字节长度
- readFile每次返回不同的Buffer值
- fs.readFile返回Buffer对象,toString将使终端报错
- Nodejs Javascript typearray到Buffer到String再返回