我是MEAN环境的新手,而不是使用promises的专家。我很困惑如何使用promise实现此行为。 我的路由器方法调用服务方法,该方法具有链接到qyery DB的promise并返回结果。我想将这些结果发送回路由器,以便我可以发送到前端。那就是问题所在,我得到了不确定。 Router.js:
myrouter('/api/getDatafromDB',(req,res){
results =getSQLResults();
res.send(results); //want to achieve that.
}
SQLServiceFile.js :
//Db connection code defined in separate js file - dbConfig.js and
//imported in connection object
getSQLResults=function(){
connection.connect().then( //promise1
function(recordset){
request.query('select * from xyz') //promise 2
.then(
//recordset fetched fine here and want to pass to router.
rec= recordset['recordset']; //basically want to pass back rec.
console.log(rec);
connection.close();
).catch(function(err){
//error handling}
connection.close();)
}
).catch(//error handling code);
}
我尝试了不同的变化,但没有奏效。现在,我认为我读到的某个地方,我需要在承诺或类似的东西中再次传回回调。我不知道。但我想如果我改变我的代码使用回调而不是承诺,它会起作用或者如果我在路由器中放回sql查询代码。 我想保持代码结构如此,所以请建议正确的方法。
答案 0 :(得分:1)
您的代码在语法上是错误的。也许下面的代码可以帮助你,这是使用promises和异步编程的正确方法。下面使用的模式称为.then chaining
。我们可以链接多个.then
以在js中实现同步模式。
.then
和.catch
仅接受函数作为参数。
myrouter('/api/getDatafromDB', (req,res) => {
getSQLResults()
.then( result => res.send(results) )
.catch( err => ErrorHandler(err) )
}
SQLServiceFile.js :
//Db connection code defined in separate js file - dbConfig.js and
//imported in connection object
function getSQLResults() {
return connection.connect()
.then( function() {
return request.query('select * from xyz')
})
.then( function(recordset) {
connection.close();
return recordset['recordset'];
})
.catch( function(err) {
connection.close();
throw err; // it can be done so that you can handle the errors in myRouter
});
}