I am using node.js "async" module and need to use the "map" method.
Basically I have an array that contains other arrays. The inner arrays contains 2 elements, a type and an image filename.
var arr0 = [];
var arr1 = ["type1", "image1.jpg"];
jsonArr.push(obj1);
var arr2 = ["type2", "image2.jpg"];
jsonArr.push(obj2);
For each inner array, I want to get the base64 encoding of the image identified by the filename and add this encoding string as the third element of the array.
I'm doing something like this:
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");
});
I know the arr.push(base64Image) stuff is the thing that is not correct, but I cannot figure out how to return the modified element.
In map(arr, iterator, callback) documentation, it is specified:
"The iterator is called with an item from the array and a callback for when it has finished processing."
The thing is I cannot figure out how to feed the callback with the new arrays.
This doesn't work because
callback
ingetImageEncoding
is called with the return value ofarr.push
(which is1
), notarr
afterarr.push
, which is what you want.You map it properly. You need to use the callback in the iterator, Try the documentation of after
The problem is that you execute your callback with the return value of
arr.push
as your result, where you really want an array as the result. Just useconcat
instead: