2016-05-04 15 views
0

Ich bin neu bei NodeJs und Code, mit dem ich arbeite, verwendet Q Framework für Versprechen. Und es scheint, dass ich das Q-Framework nicht so gut verstehe, ich stoße auf einen Fall, wenn Versprechen zu früh zurückkommen. Hier ist mein Code:NodeJs verspricht zu früh zurück

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); 
     }); 

Der obige Code ruft eine Funktion getBridgeInfo, diese Funktion soll einige DB-Abfragen tun und das Ergebnis zurück. Hier ist der Code in 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"); 
    } 
}); 

** Wenn ich diesen Code ausführen, sehe ich, dass in meinem Haupt-Code, der getBrigeInfo nennt, trifft es seinen Fang Fehlerbehandlung auch vor getBRidgeInfo vollständig ausgeführt hat, getBridgeInfo SQL-Abfrage Ergebnisse erscheinen danach.

Ich denke, die Art, wie ich bin mit Versprechungen nicht richtig gemacht wird, irgendwelche Erklärungen

Antwort

0

Ihr bitte den Schlüssel Teil fehlt, was verspricht tun können.

Sie sollten in Ihrer getBridgeInfo keine catch-Anweisungen ausführen müssen. Sie sollten das ganze Versprechen zurückgeben, das die SQL-Daten erhält ... und es in Ihrem ersten Block des Codes handhaben BridgeInfo.getBridgeInfo (exten)

Angenommen, db.getConfBridgeProfile (bridge_identifier); gibt ein Versprechen

Beispiel:

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); 
} 

ich auch Ihre Prozess-Abfrage getrennt haben aus ... die Dinge einfach halten.

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 + "]"); 
    }); 
    } 

Return Versprechen und den Fang in der Hauptfunktion behandeln. Wenn Sie bei der Verarbeitung eines Catch nicht weiterkommen, werden die SQL-Ergebnisse nicht wie gewünscht zurückgegeben.

Call:

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

Hallo, danke für die Antwort, ich herausgefunden, dass auch Q.async nicht der richtige Weg ist, ein Verfahren zu schaffen, die ein Versprechen zurück. Ich hatte getBridgeInfo, um Q.-promise-Objekt zurückzugeben – Nitesh