在蓝鸟承诺中使用一个函数的结果调用另一个函数
Using result of one function to call other in bluebird promises
我正在使用 nodejs 并尽可能将我的模型回调转换为承诺,方法是将响应数据与控制器保持一致,这样我就不需要更改控制器logic.So我需要使用我的回调在使用 bluebird 时知道这是个坏主意。
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 函数,所以我相应地调整了代码,但看起来仍然很乱。
这样做正确吗?如果我需要一个接一个地调用一系列函数,这样我就可以将一个函数的响应传递给另一个函数,依此类推。
您应该使用 asCallback
而不是手动处理回调。承诺您的节点式连接事物,并尽可能使用承诺。
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
});
};
我正在使用 nodejs 并尽可能将我的模型回调转换为承诺,方法是将响应数据与控制器保持一致,这样我就不需要更改控制器logic.So我需要使用我的回调在使用 bluebird 时知道这是个坏主意。
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 函数,所以我相应地调整了代码,但看起来仍然很乱。
这样做正确吗?如果我需要一个接一个地调用一系列函数,这样我就可以将一个函数的响应传递给另一个函数,依此类推。
您应该使用 asCallback
而不是手动处理回调。承诺您的节点式连接事物,并尽可能使用承诺。
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
});
};