我使用的是node.js“async”模块,需要使用“map”方法 基本上我有一个包含其他数组的数组。内部数组包含2个元素,一个类型和一个图像文件名。
var arr0 = [];
var arr1 = ["type1", "image1.jpg"];
jsonArr.push(obj1);
var arr2 = ["type2", "image2.jpg"];
jsonArr.push(obj2);
对于每个内部数组,我想获取由文件名标识的图像的base64编码,并将此编码字符串添加为数组的第三个元素。
我正在做这样的事情:
var fs = require("fs");
var async = require("async");
function getImageEncoding(arr, callback){
console.log("getEncoding:" + arr + "\n");
// Get image filename
image = arr[1];
// Read file and get base64 encoding
fs.readFile(image, function(err, original_data){
var base64Image = original_data.toString('base64');
console.log("test:" + base64Image + "\n");
// Modify current arr by appendingthe base64 encoding of the image
callback(null, arr.push(base64Image));
});
}
async.map(arr0, getImageEncoding, function(err, results){
console.log("in async.map: " + results + "\n");
});
我知道arr.push(base64Image)的东西是不正确的东西,但我无法弄清楚如何返回修改后的元素。
在map(arr,iterator,callback)文档中,指定了:
“使用数组中的项目调用迭代器,并在完成处理时调用回调函数。”
问题是我无法弄清楚如何使用新数组提供回调。
答案 0 :(得分:1)
这不起作用,因为callback
中的getImageEncoding
使用返回值arr.push
(即1
)进行调用,而不是arr
之后的arr.push
,这就是你想要的。
function getImageEncoding(arr, callback){
console.log("getEncoding:" + arr + "\n");
// Get image filename
image = arr[1];
// Read file and get base64 encoding
fs.readFile(image, function(err, original_data){
var base64Image = original_data.toString('base64');
console.log("test:" + base64Image + "\n");
// Modify current arr by appendingthe base64 encoding of the image
arr.push(base64Image);
callback(err, arr);
});
}
async.map(arr0, getImageEncoding, function(err, results){
console.log("in async.map: " + results + "\n");
});
答案 1 :(得分:1)
您正确映射它。您需要在迭代器中使用回调,请尝试after
的文档var fs = require("fs");
var after = require("after");
function getImageEncoding(tuple, callback){
fs.readFile(arr[1], function(err, data){
if (err) return callback(err)
callback(null, tuple.concat(data.toString('base64'))
});
}
after.map(arr0, getImageEncoding, function(err, results){
console.log("in after.map: " + results + "\n");
});
答案 2 :(得分:1)
问题是你用返回值arr.push
作为结果来执行你的回调,你真的想要一个数组作为结果。只需使用concat
代替:
callback(null, arr.concat(base64Image));