NodeJs 承诺返回得太早

NodeJs promises returning too early

我是 NodeJs 的新手,我正在使用的代码使用 Q 框架来实现承诺。 而且我似乎不太了解 'Q' 框架,我 运行 正在处理 promises return 太早的情况。 这是我的代码:

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,这个函数应该做一些数据库查询和return结果。 这是 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 完全执行之前就命中了它的捕获错误处理程序,getBridgeInfo 的 SQL 查询结果之后出现

我认为我使用 promises 的方式不正确,请给出任何解释

你错过了 promises 可以做什么的关键部分。

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

假设 db.getConfBridgeProfile(bridge_identifier); return一个承诺

示例:

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

I've also seperated out your process query... keep things simple.

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 承诺并处理主函数中的捕获。您在处理捕获时陷入困境,SQL 结果没有得到应有的 returned。

通话:

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