我是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查询结果。
我认为我使用承诺的方式没有正确完成,请解释
答案 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 + "]");
});
}