2012-03-01 55 views
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)的東西是不正確的東西,但我無法弄清楚如何返回修改後的元素。

在地圖(ARR,迭代器,回調)文檔中,規定:

「該迭代器被調用,從數組中的項,並且當它已經完成處理的回調」

事情是我無法弄清楚如何提供新的數組回調。

回答

1

這不起作用,因爲在getImageEncodingcallback被稱爲與arr.push(這是1)的返回值,而不是arrarr.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 2012-03-01 15:20:22

+0

但是,他們確實通過引用傳遞這是不正確的參數是通過複製傳遞。上面的代碼修改原始數組(即最終回調中的'arr0 [0] === results [0]')。 – 2012-03-01 15:26:44

+0

@Linus我以爲===不是參考比較運算符,而是沒有轉換的比較運算符。我沒有在v8和node.js上找到關於此的參考,但是在mozilla doc中我發現這個:https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators – Nicocube 2012-03-01 15:51:39

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

雖然後看起來很酷,提問者的問題似乎是他想要的結果包括原始數組,但還有base64數據。 – 2012-03-01 15:16:13

+1

@LinusGThiel固定:) – Raynos 2012-03-01 16:30:33

+0

不錯!雖然你真的必須傳遞一個數組來連接嗎?可能是一個我不熟悉的瀏覽器,但它很樂意與簡單的參數連接(是的,它的變量太引導了!)。 – 2012-03-01 17:30:05

1

問題的文件是你與執行回調函數的arr.push爲你的結果,返回值,你真的想要一個數組作爲結果。只需使用concat代替:

callback(null, arr.concat(base64Image));