8

私は gm を使用しており、そのサイズに応じて画像を処理しようとしています。"size" getter にはコールバック関数が必要なため、次の行では size を使用できません。

私がやりたいことは次のようなものです:

function processImage(url) {
    var img = gm(this.getImgStream(url));

    var width, height;
    img.size(function(err, val) {
        width = val.width;
        height = val.height;
    });

    // I want to use width here, but it's undefined when this line is executed.
    if (width > 500) width = 500;
    return img.resize(width)
}

次のサイズ変更メソッドで幅を使用したい。同期的にサイズを取得する方法や、コールバックが完了するのを待つ方法はありますか? ivar はできるだけ長く使用したくありません。

4

3 に答える 3

9

は非同期であるためimg.size()、操作を同期的に実行することはできません (つまりreturn、戻り値にも使用できません)。したがって、img.size()他のことを行う前に終了する必要があります。操作内でコールバックを割り当てるか、コールバックを渡すことができます。

function processImage(url, callback) {
  var img = gm(this.getImgStream(url));

  var width, height;
  img.size(function(err, val) {
    width = val.width;
    height = val.height;

    callback(err, width, height);
  });
};

processImage(url, function(err, width, height) {
  if (width > 500) width = 500;
  img.resize(width);
});
于 2013-10-29T05:10:21.837 に答える