0

全て、

サイズ = [20,40,60,80] などのサイズの配列があります

それらをループし、src イメージのサイズをそれぞれのサイズに変更して、適切な名前を付ける必要があります。

次に、knox を使用して s3 にアップロードし、サイズ変更された画像を削除します。

ここに私が持っているものがあります:

http://jsfiddle.net/bpoppa/ZAcA7/

問題はフロー制御です。knox が putFile を試行すると、ファイルが存在しないというエラーが表示されます。これは、サイズ変更が完了する前に knox が実行されているか、その時点で既に削除されていることを意味します。

任意のヒント?すべての助けに感謝します。

ありがとう!

4

1 に答える 1

3

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*/
            });

    });
};
于 2012-04-29T05:10:22.900 に答える