NodeJS中的承诺

时间:2015-07-20 11:50:00

标签: node.js

我试图使用Bluebird或Q将一些回调转换为NodeJS中的Promises,但我没有成功。 任何人都可以很好,并举例说明如何将上述代码转换为Promises?

提前致谢

阿德里安

{{1}}

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(您声明的声明),然后您可以在几步之后使用它。