2012-03-01 5 views
0

Я использую модуль node.js «async» и вам нужно использовать метод «map».
В основном у меня есть массив, содержащий другие массивы. Внутренние массивы содержат 2 элемента, тип и имя файла изображения.Невозможно использовать функцию «map» в асинхронном модуле

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) материал является вещь, которая не является правильным, но я не могу понять, как вернуть измененный элемент.

В карте (аранжировка, итератор, обратный вызов) документации, указано:

«Итератор вызывается с элементом из массива и обратного вызова для того, когда он закончил обработку»

Дело в том, что я не могу понять, как подать обратный вызов с новыми массивами.

ответ

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"); 
}); 
+0

спасибо, что работает отлично – Luc

+0

Но это не так, что параметры передаются копией, они действительно передаются по ссылке. Код выше _will_ изменяет исходный массив (т. Е. 'Arr0 [0] === results [0]' в последнем обратном вызове). –

+0

@ Linus Я думал === не был оператором сравнения сравнения, а сравнением без конвертации. Я не нашел ссылку на v8 и node.js об этом, но в mozilla doc я нашел это: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators – Nicocube

1

Вы правильно его сопоставляете. Вы должны использовать функцию обратного вызова в итератора, Try документацию 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"); 
}); 
+0

Хотя после того, как выглядит здорово, проблема афера, похоже, заключается в том, что он хочет, чтобы результаты состояли из исходных массивов, но с данными base64. –

+1

@LinusGThiel исправлено :) – Raynos

+0

Ницца! Вам действительно нужно передать массив в concat? Возможно, это браузер, с которым я не знаком, но он с удовольствием сочетается с простыми параметрами (да, это тоже вариация!). –

1

Проблема заключается в том, что вы выполняете свой обратный вызов с возвращаемое значение arr.push как ваш результат, где вы действительно хотите массив в качестве результат. Просто используйте concat вместо:

callback(null, arr.concat(base64Image)); 
Смежные вопросы