使用一个函数的结果在bluebird promises中调用其他函数

时间:2016-09-13 14:15:04

标签: javascript node.js bluebird

我正在研究nodejs,并通过保持响应数据与控制器相同,尽可能地将模型回调转换为promises,这样我就不需要更改控制器逻辑了。所以我需要使用回调,我知道这是一个坏的与蓝鸟合作的想法。

 var functions={ 
              checkifexists:function(data){
              return new Promise(function(resolve,reject){
                // Query is fired here  
                resolve(data) or reject (data) 
              }); 
            },
             create:function(data,cb{
              mysql.getConnectionFromPool(function(err,connection){
              this.checkifexists(data,connection).then(function(res){
                if(res.count)
                 {
                    cb(res.count);
                }
                else
                {
                    connection.query(insertsql,data,function(err,data){
                         // Handle any error or return insertID
                           cb(null,insertID)
                    });
                }
            }).catch(function(e){
                console.log(e);
            }).finally(function(){
                connection.release();
            });
        });}

基于已接受的答案样本控制器代码:

 sampleModel.create(req.body,function(err,result){
    console.log("Err : "+err); // Always Null
    console.log("Result :"+result); // Always displays both reject and resolve cases
});

在上面的代码中有一个checkifexists函数和一个create函数,但是从控制器只调用create函数,所以我相应地调整了代码,但看起来仍然很乱。

这是正确的方法吗?如果我需要一个接一个地调用一系列函数,以便我可以将一个函数的响应传递给另一个函数,等等。

1 个答案:

答案 0 :(得分:1)

您应该使用asCallback而不是手动处理回调。宣传您的节点式连接,并尽可能使用promises。

var functions = {
    getConnection: function() {
        return Promise.fromCallback(mysql.getConnectionFromPool.bind(mysql))
        .disposer(function(connection) {
            connection.release();
        });
    },
    checkifexists: function(data, connection) {
        return new Promise(function(resolve,reject) {
            // Query is fired here  
            resolve(data) or reject (data) 
        }); 
    },
    insert: function(data, connection) {
        return Promise.fromCallback(connection.query.bind(connection, insertsql, data));
    },
    create: function(data, cb) {
        return Promise.using(this.getConnection(), function(connection) {
            return this.checkifexists(data, connection)
            .then(function(res) {
                if (res.count) {
                    throw res.count; // are you sure?
                } else {
                    return this.insert(data, connection);
                }
            }.bind(this))
        }.bind(this))
        .asCallback(cb); // this is all you need
    });
};