0

JS コールバックの仕組みを理解するのに少し苦労しています。コールバックが JS でどのように使用されるかについてはかなりの考えがありますが、コールバックがどのように非同期であるかはわかりません。

たとえば、私の理解が正しければ、コールバックの性質は次のとおりです。

db.query(param1, param2 , callback_fn1(){..} );

db.query() の実装は次のようになります。

 db.prototype.query = function(p1 , p2 , callback ){
      //some code 
      callback();
}

上記の実装はどのようdb.queryに非同期関数を作成しますか? callbackこれは、呼び出された関数が に渡されquery、その関数が内部で呼び出されるという意味ではありませんqueryか? query単なる別の同期関数のようです。誰かが私がここで見落としていることを理解するのを手伝ってくれますか? ありがとう!

4

2 に答える 2

3

あなたが示したコードサンプルは、すぐに実行するように指示されているため、実際にはまだ同期しています。非同期コールバックは、すぐに実行する必要がないコールバックであるため、実行を指示するまでイベント ループをブロックしません。

Node.js でこれを行う最も一般的な方法はprocess.nextTick()、イベント ループのコール スタックが空のときに指定された関数を実行する方法です。次に例を示します。

var async = function(args, callback) {
  // do some work
  process.nextTick(function() {
    callback(val);
  });
};

次に、次のように関数を呼び出します。

async(args, function(val) {
  console.log(val);
});
console.log('end');

この例では、関数async()console.log('end')がコール スタックに追加されます。コール スタックは、これらの関数が両方とも実行されると空になり、空になるとconsole.log(val)実行されます。

まだ混乱している場合はprocess.nextTick()、このコードの最適化されたバージョンと考えてください。

var fn = function() {};
setTimeout(fn, 0);

基本的には、「忙しくないときにできるだけ早くこの機能を実行する」ことを意味します。

于 2013-09-29T16:46:41.953 に答える