node.js コードは非同期で実行されることを覚えておく必要があります。元のコードでは、knox
コードは完了する前に実行image.resize
されています (コールバックは、エラーを処理するためだけでなく、操作がいつ完了したかを通知するために使用されます)。ノードはコールバックを待たず、関数内のコードを実行し続けます。また、クロージャーを作成せずに for ループで匿名のコールバックを使用することにも注意する必要があります。
一般に、次のコードのようにコールバックを使用してプログラム フローを制御し、前のアクションが完了したときにのみ次のアクションを実行するようにします。
var src = name + '.jpg';
for (var i = sizes.length - 1; i >= 0; i--) {
var k = i;
var dest = sizes[k] + '.jpg';
var s3 = sizes[k] + '.jpg';
resizeAndPut(src, dest, s3, sizes[k]);
}
fs.unlink(src); /* delete the source file now */
var resizeAndPut = function (src, dest, s3, size) {
easyimage.resize(
{
src: src,
dst: dest,
width: size,
height: size
}, function(err, image) {
if (err) throw err;
knox.putFile(dest, s3, function(err, res) { /* does image contain the path?, if so, might want to use image.path or the like instead of dest here */
if (err) throw err;
fs.unlink(dest); /* delete the local file*/
});
});
};