2016-05-04 2 views
0

私はNodeJsで新しく、私はQフレームワークを使ってコードを公開しています。 そして、私は 'Q'フレームワークをあまりよく理解していないと思われます。私は、約束が早すぎると返答するケースにぶつかります。この関数は、いくつかのDBクエリを実行し、結果を返すことになっている、NodeJsの返答が遅すぎる

BridgeInfo.getBridgeInfo(exten) 
     .then(function processBridgeInfo(bridge_info) { 
      console.log("Nitesh -- bridge info is back, yay"); 
      if (bridge_info !== undefined) { 
      conf_bridge = new VoxConfBridge(ari); 
      conf_bridge.init(bridge_info); 

      /**Add the bridge to the bridgeList**/ 
      bridgeList[conf_bridge.bridge.id] = conf_bridge; 
      console.log("Bridge ID to register is "+ conf_bridge.bridge.id); 

      self.registerEvents(conf_bridge.bridge); 
      conf_bridge.registerUser(event, false, channel); 
      } else { 
      console.log("Unknown extension [" + exten + "] blocking it"); 
      ChannelDriver.blockChannel(ari, channel.id); 
      } 
     }) 
     .catch(function handleError(err) { 
      console.error("Nitesh -- [voxbridgemanager] error occured "+err); 
     }); 

上記のコードは、関数を呼び出しgetBridgeInfo: はここに私のコードです。ここ は、私はこのコードを実行すると、私はgetBrigeInfoを呼び出す私のメインのコードで、それはgetBRidgeInfoは、完全にgetBridgeInfoのSQLクエリを実行する前であってもそのキャッチエラーハンドラを打つことがわかり** getBridgeInfo

BridgeInfo.getBridgeInfo = Q.async(function(bridge_identifier) { 
    console.log("Nitesh -- Getting the bridge info for ["+ bridge_identifier + "]"); 
    if (bridge_identifier !== undefined) { 
    db.getConfBridgeProfile(bridge_identifier) 
    .then(function processBridgeProfile(result) { 
     if (result !== undefined) { 
     console.log("Nitesh -- Bridge Info is "+ JSON.stringify(result)); 
     var bridge_info = new BridgeInfo(); 
     bridge_info.init(result) 
     .then (function bridgeInfoInitDone() { 
      return bridge_info; 
     }) 
     .catch(function handleError(err) { 
      console.error("Nitesh ---[bridgeInfoInit] Error is "+ err); 
     }); 
     } 
     else { 
     console.log("Can't find any bridge profile for this identifier ["+ bridge_identifier + "]"); 
     } 
    }, function handleError(err) { 
     console.error("Failed to retrieve bridgeInfo"); 
    }); 
    } else { 
    console.error("Received an invalid identifier"); 
    } 
}); 

のコードですその後の結果が表示されます。

私は約束を使用している方法は、任意の説明をしてください

答えて

0

あなたは約束は何ができるかの重要な部分が欠落し、正しく行われていないと思います。

getBridgeInfoでcatchステートメントを実行する必要はありません。 SQLデータを取得する約束を返す必要があります。最初のコードブロックで処理してください。BridgeInfo.getBridgeInfo(exten)

db.getConfBridgeProfile(bridge_identifier);と仮定します。約束

例を返します。私も...あなたのプロセスのクエリを区切って物事をシンプルまし

BridgeInfo.getBridgeInfo = function(bridge_identifier) { 
    console.log("Nitesh -- Getting the bridge info for ["+ bridge_identifier + "]"); 
    if (bridge_identifier !== undefined) { 
    return Q.fcall(function() { 
     throw new Error("Received an invalid identifier"); 
    }); 
    } 
    return db.getConfBridgeProfile(bridge_identifier); 
} 

BridgeInfo.processBridgeProfile = function(result) { 
    if (result !== undefined) { 
    console.log("Nitesh -- Bridge Info is "+ JSON.stringify(result)); 
    var bridge_info = new BridgeInfo(); 
    return bridge_info.init(result); 
    }else{ 
    return Q.fcall(function() { 
     throw new Error("Can't find any bridge profile for this identifier ["+ bridge_identifier + "]"); 
    }); 
    } 

リターンを約束し、メイン機能でキャッチを扱います。あなたはキャッチを扱うのに悩まされているので、SQLの結果は返されません。

コール:

BridgeInfo.getBridgeInfo(bridge_identifier).then(function(result){ 
    return BridgeInfo.processBridgeProfile(result) 
}).then(function(){ 
    //Do the rest here 
}).catch(function(){ 
    //One catch to rule them all :) 
}); 
+0

こんにちは、応答のためのおかげで、私もQ.asyncは約束を返すメソッドを作成するための正しい方法ではないことを考え出しました。 Q.promiseオブジェクトを返すgetBridgeInfoがありました。 – Nitesh