我试图使用Bluebird或Q将一些回调转换为NodeJS中的Promises,但我没有成功。 任何人都可以很好,并举例说明如何将上述代码转换为Promises?
提前致谢
阿德里安
{{1}}
答案 0 :(得分:1)
使用bluebird
,查看promisification section。
基本上你可以这样做:
var fs = require("fs");
Promise.promisifyAll(fs);
Promise.promisifyAll(dbHandle); //do this globally if it is global, not every request!
然后你的代码就像:
function httpResponse(request, response) {
fs.readFileAsync('views/main.ejs', 'utf-8')
//Special catch only for EJS errors. ONce past this point in the chain, will not hit again.
.then( function(file){
return dbHandle.queryDBAsync({}, "domains");
} )
.then( function(domains){
ejsData.domains = domains;
return dbHandle.queryDBAsync({}, "type");
})
.then( function( types ){
ejsData.type = types;
response.writeHead(200, {"Content-Type": "text/html"});
response.end(ejs.render(file, ejsData));
})
.catch( function(error){
response.writeHead(200, {"Content-Type": "text/plain"});
response.write('EJS ERROR'); //or DB errors, add some handling if the error message is important
response.end();
});
}
我将所有这些链接起来以保持代码更平坦。你也可以嵌套承诺。但是Promisification是建立图书馆的方式。
修改强>
要保持file
的范围,请尝试像这样的Promise设置。注意嵌套的Promise。
function httpResponse(request, response) {
fs.readFileAsync('views/main.ejs', 'utf-8')
//Special catch only for EJS errors. ONce past this point in the chain, will not hit again.
.then( function(file){
return dbHandle.queryDBAsync({}, "domains")
.then( function(domains){
ejsData.domains = domains;
return dbHandle.queryDBAsync({}, "type");
})
.then( function( types ){
ejsData.type = types;
response.writeHead(200, {"Content-Type": "text/html"});
response.end(ejs.render(file, ejsData));
})
.catch( function(error){
response.writeHead(200, {"Content-Type": "text/plain"});
response.write('EJS ERROR'); //or DB errors, add some handling if the error message is important
response.end();
});
}
另一种方法是跟踪Promise链外的file
变量。返回readFileAsync
后,将result
存储到file
(您声明的声明),然后您可以在几步之后使用它。