[英]How to iterate over the following code inside a for-loop?
我有以下代碼,它抓取6個URL之一,剝離文件名,創建文件路徑,將圖像文件保存到磁盤,將其發送到MongoDB GridFS。 唯一不變的是圖像尺寸:32px,64px,128px,256px,512px,1024px。 Bruteforce方法只是復制並粘貼此代碼6次,你只能想象會是什么樣的混亂。
我怎樣才能內部for循環將此代碼,其中32將改變到64,128,256,512,1024,每次循環迭代?
var filename32 = image32.replace(/^.*[\\\/]/, '');
var filepath32 = path.join(__dirname, filename32);
var writestream32 = gfs.createWriteStream({ filename: filename32 });
var imageStream32 = request(image32).pipe(fs.createWriteStream(filepath32));
imageStream32.on('close', function() {
fs.createReadStream(filepath32).pipe(writestream32);
fs.unlink(filepath32);
});
好的,所以使用迭代方法無法解決這個問題。 更多信息: node.js:while循環回調未按預期工作 。 TLDR :因為node.js和javascript是單線程的。
像這樣的東西? 我不確定實際需要將圖像大小附加到它上面,我只是猜到了文件名。
for(var i=32; i <= 1024; i*=2) {
var filename = image.replace(/^.*[\\\/]/, '') + i;
var filepath = path.join(__dirname, filename);
var writestream = gfs.createWriteStream({ filename: filename });
var imageStream = request(image).pipe(fs.createWriteStream(filepath));
imageStream.on('close', function() {
fs.createReadStream(filepath).pipe(writestream);
fs.unlink(filepath);
});
}
使用數組? 我不確定我是否理解你的問題,因為這個解決方案看起來很傻......
// use this array to store file names(urls).
var imagesName = new Array("32.png", "128.png", "256.png", "512.png", "1024.png");
for (var i = 0; i < imagesName.length; i++) {
var filename = imagesName[i].replace(/^.*[\\\/]/, '');
var filepath = path.join(__dirname, filename);
var writestream = gfs.createWriteStream({ filename: filename });
var imageStream = request(imagesName[i]).pipe(fs.createWriteStream(filepath));
imageStream32.on('close', function() {
fs.createReadStream(filepath).pipe(writestream);
fs.unlink(filepath);
});
}
如果您所做的只是每次都加倍,則不需要數組。 正如@ bitwiser的回答所顯示的,計算2的冪是微不足道的。
但是之前的兩個答案都有一個錯誤。 它們在imageStream32.on('close')
回調中使用filepath
和writestream
變量,但是,在for
循環完成執行后 ,異步調用此回調。 因此,所有這些回調都使用這兩個變量最后一次通過循環接收的最后一個值,而不是正確循環迭代中的正確值。
很容易解決這個問題:你只需要為每個循環迭代調用一個函數,而不是將代碼直接放在循環體中。 函數調用創建一個閉包,為每個圖像單獨保留這些變量,因此您將為每個圖像編寫和關閉正確的文件。
此外,您沒有定義生成文件名的image32
變量。 你真的需要復雜的正則表達式嗎? 你不知道圖像文件名應該是什么嗎? 我假設文件名是'image32'
... 'image1024'
,但你可以很容易地改變它。
所以代碼看起來像這樣:
function processImages( basename, minSize, maxSize ) {
for( var size = minSize; size <= maxSize; size *= 2 ) {
processImage( size );
}
function processImage( size ) {
var filename = basename + size;
var filepath = path.join( __dirname, filename );
var writestream =
gfs.createWriteStream({ filename: filename });
var imageStream =
request(image).pipe( fs.createWriteStream(filepath) );
imageStream.on( 'close', function() {
fs.createReadStream(filepath).pipe(writestream);
fs.unlink(filepath);
});
}
}
processImages( 'image', 32, 1024 );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.