1

im.identify以下では、 beforeを評価しようとしましたconsole.log(toObtain)console.log(toObtain)、 after が呼び出されたようim.identifyです。関数が呼び出したい順序で正確に呼び出されるようにするにはどうすればよいですか?

var toObtain; //I'm trying to set the value of this variable to features (inside the callback).

var im = require('imagemagick');
im.identify('kittens.png', function(err, features){
  if (err) throw err
  //console.log(features);
  toObtain = features;
  console.log(toObtain); //this prints { format: 'PNG', width: 400, height: 300, depth: 8 }
})

console.log(toObtain); //This function call is evaluated BEFORE im.identify, which is exactly the opposite of what I wanted to do.
4

3 に答える 3

2

これがノードの仕組みです。これは通常の非同期動作です。

ノードを操作するときに気が狂わないようにするには、それぞれが特定の目的を持つ関数に分割することが重要です。各関数は、必要に応じて次に渡すパラメーターを呼び出します。

var im = require('imagemagick');

var identify = function () {

      im.identify('kittens.png', function(err, features){

         doSomething(features) // call doSomething function passing features a parameter.

      })

}(); // this is the first function so it should self-execute.

var doSomething = function (features) {

       var toObtain = features;

       console.log(toObtain) //or whatever you want to do with toObtain variable
};
于 2012-09-22T03:50:27.563 に答える
2

非同期とは、準備ができたときに物事が発生することを意味します (相互に同期関係はありません)。

これは、非同期関数内で作成された値を出力したり、その他の方法で操作したい場合は、値が使用可能であることが保証されている唯一の場所であるため、コールバックで実行する必要があることを意味します。

複数のアクティビティを順番に並べて次々と発生させたい場合は、caolan によって書かれたasync javascript ライブラリなど、非同期関数を同期的に (次々に) "チェーン" するさまざまな手法のいずれかを適用する必要があります。

あなたの例で async を使用すると、次のようになります。

var async=require('async');

var toObtain;

async.series([

  function(next){ // step one - call the function that sets toObtain

    im.identify('kittens.png', function(err, features){
      if (err) throw err;
      toObtain = features;
      next(); // invoke the callback provided by async
    });

  },

  function(next){ // step two - display it
    console.log('the value of toObtain is: %s',toObtain.toString());
  }
]);

これが機能する理由は、非同期ライブラリが、現在のアクションが完了したときに呼び出す必要があるシリーズの次の関数に移動するために使用される特別なコールバックを提供するためです。

next() コールバックを介して一連の次の関数に値を渡す方法、および async.series() 関数の結果として値を渡す方法など、詳細については、非同期ドキュメントを参照してください。

async は、次を使用してアプリケーションにインストールできます。

npm install async

またはグローバルに、以下を使用してすべての nodejs アプリケーションで利用できるようにします。

npm install -g async
于 2012-09-22T03:52:31.643 に答える
0

im.identify シームは非同期であるため、これは正常です (コールバックが必要です)。したがって、コールバックは次の行のに実行できます。

編集:したがって、ユーザーがコールバックで取得するコードを後で配置する必要がありますtoObtain = features;

于 2012-09-22T03:24:37.990 に答える