我想弄清楚如何使用Promise,特别是Q实现来清理一些杂乱的嵌套回调在一个Node.js程序中。不幸的是,似乎很少有简单的例子可以说明我想做的事情。
这里是我现在拥有的嵌套回调的简化版本:
这里是我现在拥有的嵌套回调的简化版本:
var parent = this;
this.receiveMessage(params, function(err, request) {
if (err) console.log(err, err.stack);
else {
parent.handleMessage(request, function(response) {
parent.sendMessage(JSON.stringify(response), function() {
console.log("response sent");
var params = { ReceiptHandle:request.Messages[0].ReceiptHandle };
parent.deleteMessage(params, function() {
parent.waitForMessage();
});
});
});
}
});
如您所见,这段代码比较混乱,有四层嵌套的回调函数。
使用Q库,我已经找出了解决方法,您需要像下面这样开始:
Q.nfcall(this.connection.receiveMessage, params)
.then(function(err, request) {
return(Q.nfcall(this.handleMessage(request));
})
.then(function(response)) {
return(Q.nfcall(this.sendMessage(JSON.stringify(response))));
} ...
等等……这好像不太对。首先,我需要在链中的每个函数上调用Q.nfcall吗?此外,我如何避免使用回调时出现的“this”作用域问题?我是否正确地使用了promises?
handleMessage
、sendMessage
和deleteMessage
实际上并不遵循节点回调约定。 - Bergi