Promise你把握不住?来看看异步转同步改造
前言
先说一下上一篇NodeJS文章
NodeJS 后端开发 06 连接MySQL
,这一篇展示了一个数据库链接的db.js 工具库。
该工具库提供了一个runSql函数,它的运行方式是先提交SQL,然后再异步把查询结果回调传递给callback函数的。
这个函数只适用于提前加载数据的情况,比如预先缓存批量的查库结果。然后用户请求WebAPI的时候,直接读查询缓存。
这样会有下面的问题:
- 新数据入库了,本地缓存需要更新。
- 而且无法支持动态查询。
说这么多,直接用Koa做个接口演示一下查询效果吧。
代码展示,KOA做接口查询数据库
const koa = require('Koa');
const app = new koa()
var router = require('koa-router')();
var db = require('./db-lite');
//做个简单接口
router.get('/', function(ctx, next){
ctx.body='Hello, geeklevin!'});
//做个接口查询数据库
router.get('/query', function(ctx,next){
db.runSql("SELECT * FROM COMPANY; ", function(result,fields){
console.log('查询结果:', result);
ctx.body = JSON.stringify(result);
console.log('设置响应body成功!');
});
console.log('processing');
});
//启动服务器
app.use(router.routes());
const PORT = 8081
console.log('start app at port %s', PORT)
app.listen(PORT);
先查看简单接口展示效果:
再看看/query接口
日志看到设置了响应体ctx.body成功了,可这时候请求已经结束了。
因为db.runSql函数不是同步执行了,/query这个接口执行这个函数,碰到函数结束了,当前请求处理完毕,没有设置请求体,所以响应Not Found。
看看Promise吧
var data = new Promise(function(resolve, reject){
asynFunction(function(error, result){
if(error){
reject(error);
}else{
resolve(result);
}
});
});
async getData(){
var result = await data();
console.log('result is:', result);
}
就两段代码,第一段是构造Promise对象;第二段为调用Promise对