NodeJs承诺过早返回

时间:2016-05-04 10:52:20

标签: node.js q

我是NodeJs的新手,我正在使用的代码是使用Q框架进行承诺。 似乎我不太了解'Q'框架,我遇到了承诺过早返回的情况。 这是我的代码:

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,这个函数应该做一些数据库查询并返回结果。 这是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");
  }
});

**当我运行这段代码时,我发现在我的主代码中调用getBrigeInfo,它甚至在getBRidgeInfo完全执行之前就会遇到它的catch错误处理程序,之后会出现getBridgeInfo的SQL查询结果。

我认为我使用承诺的方式没有正确完成,请解释

1 个答案:

答案 0 :(得分:0)

你错过了承诺可以做的关键部分。

您不应该在getBridgeInfo中执行任何catch语句。你应该返回获取SQL数据的整个promise ...并在你的第一个代码块BridgeInfo.getBridgeInfo(exten)中处理它

假设db.getConfBridgeProfile(bridge_identifier);返回承诺

示例:

<td>
  

我还分离了你的流程查询...保持简单。

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

返回promises并处理main函数中的catch。你在处理一个catch时遇到困难,SQL结果不会像他们应该那样返回。

呼叫:

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