0

我正在使用 node.js“异步”模块,需要使用“地图”方法。
基本上我有一个包含其他数组的数组。内部数组包含 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) 文档中,它被指定:

“迭代器使用数组中的项目和完成处理时的回调来调用。”

问题是我无法弄清楚如何用新数组提供回调。

4

3 回答 3

1

这不起作用,因为callbackingetImageEncoding是使用(即)的返回值arr.push1调用的,而不是arrafter 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");
});
于 2012-03-01T15:01:44.050 回答
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");
});
于 2012-03-01T15:04:53.540 回答
1

问题是您使用返回值arr.push作为结果执行回调,而您确实想要一个数组作为结果。只需使用concat

callback(null, arr.concat(base64Image));
于 2012-03-01T15:14:02.653 回答