Promise你把握不住?来看看异步转同步改造

本文通过实例演示了如何将传统的异步回调转换为使用Promise和async/await的同步风格,以解决NodeJS中数据库查询的异步问题。介绍了Promise的基本用法和async函数的特性,展示了如何改造原有的runSql函数以支持Promise,并在Koa接口中使用await等待查询结果,从而实现异步操作的同步处理。
摘要由CSDN通过智能技术生成

Promise你把握不住?来看看异步转同步改造

前言

先说一下上一篇NodeJS文章
NodeJS 后端开发 06 连接MySQL
,这一篇展示了一个数据库链接的db.js 工具库。

该工具库提供了一个runSql函数,它的运行方式是先提交SQL,然后再异步把查询结果回调传递给callback函数的。

这个函数只适用于提前加载数据的情况,比如预先缓存批量的查库结果。然后用户请求WebAPI的时候,直接读查询缓存。
这样会有下面的问题:

  1. 新数据入库了,本地缓存需要更新。
  2. 而且无法支持动态查询。

说这么多,直接用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对

评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷学委

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值