0

このコールバック関数を正しく取得できないようです。

dispatch: function (query, callback) {
  var result = new Object() ;
  var qd = new queryDispatcher.init();
  var google = qd.callGoogle(query, function(a,b) {
    result.gdocs = a ; 
    result.gtotal = b ; 
  }) ;       

  var bing = qd.callBing(query, function(a,b) {
    result.bdocs = a ; 
    result.btotal = b ;            
  }) ; 

  var yahoo = qd.callYahoo(query, function(c,d) {
    result.ydocs = c ; 
    result.ytotal = d ; 
  }) ; 

  callback(result);
},

ご覧のとおり、クエリがディスパッチされ、結果が結果オブジェクトに追加されています。ただし、コールバック(結果)は、次のように親関数に空のオブジェクトを返しています。

var results = meta.dispatch(query, 
  function(result) {
    console.log(result);
  });
});

どんな助けでも大歓迎です!

4

2 に答える 2

0

非同期アプローチでは、実行の流れがコードの流れと同じではないことを覚えておくことが重要です。非同期関数を設定した後、実行フローは続行されますが、非同期関数からの結果はまだ準備ができていない可能性があります。この場合、実行が に達したとき、非同期関数が終了していないため、オブジェクトにはまだcallback(result)何も設定されていません。resultしたがって、何らかの方法で非同期関数をチェーンする必要があります。「ブルート フォース」(非並列) アプローチは次のようになります。

qd.callGoogle(query, function(result1) {
    qd.callBing(query, function(result2) {
        qd.callYahoo(query, function(result3) {
             callback(combinedResult);
        });
    })
})

しかし、nodejs を使用している場合はnode-seq 、ブラウザーで使用する場合はjQuery Deferred/Promiseなどのフロー ライブラリを調べることを強くお勧めします。

于 2013-03-30T21:17:55.283 に答える
0

コールバックは同期的ですが、プロパティは非同期的に取得されます。コールバックが呼び出されると、得られるのは実際には空のオブジェクトだけです。

3 つすべての回答が得られた後でのみ、コールバックを呼び出す必要があります (たとえば、カウンターを使用します)。

dispatch: function(query, callback) {
  var result = new Object(),
      qd = new queryDispatcher.init(),
      counter = 3;

  var google = qd.callGoogle(query, function(a,b) {
    result.gdocs = a ; 
    result.gtotal = b ; 
    checkCallback();
  }) ;       

  var bing = qd.callBing(query, function(a,b) {
    result.bdocs = a ; 
    result.btotal = b ;   
    checkCallback();         
  }) ; 

  var yahoo = qd.callYahoo(query, function(c,d) {
    result.ydocs = c ; 
    result.ytotal = d ; 
    checkCallback();
  });

  function checkCallback() {
    if (--counter == 0) {
      callback(result);
    }
  }
}

しかし、私はコールバックの代わりにプロミスを使いたいと思っています。強力なアプローチです。

于 2013-03-30T21:18:03.570 に答える