一,async异步编程

1,异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等

waterfall函数 瀑布流

waterfall每个函数产生的值,都将传给下一个函数

2,事务

数据库事物(transaction)就是一组SQL语句,这组SQL语句是一个逻辑工作单元。我们可以认为事务就是一组不可

分割的SQL语句,在执行时,应该作为一个整体永久性地修改数据库的内容,或者作为一个整体取消对数据库的所有修改。

例:银行转帐:将钱从一个银行帐号转到另一个帐号中通常包含二个步骤:一条UPDATE语句负责从一个银行帐号的总额中减去一定的钱数,另外一条UPDATE语句负责向另外一个银行帐号中增加钱数,这两个减少和增加操作要么同时永久性地保存到数据库,要么全部取消――――否则就会有一部份钱丢失了。

二,

1,在网页中提交数据

Zxly.ejs

<script src="../js/jquery.min.js"></script><script type="text/javascript">var i=0;$(document).ready(function(){$("#send").click(function(){if(i==1){alert("请不要重复提交!")}else {i=1;var nc = $("#nc").val();var qq = $("#qq").val();var em = $("#em").val();var zt = $("#zt").val();var nr = $("#nr").val();$.get("../action/zxly.js", {nc: nc, qq: qq, em: em, zt: zt, nr: nr}, function (result) {console.log(result.args);if (result.args=="ok") {alert("留言成功!")}})}})})</script>

<div class="message-table">                    <ul><li><span class="tab-tit">昵 称 :</span><span><input type="text" name="name" id="nc" placeholder="请输入昵称" autocomplete="off"></span><span class="tab-des">∗</span></li><li><span class="tab-tit">Q Q :</span><span><input type="text" name="qq" id="qq" placeholder="请输入QQ" autocomplete="off"></span></li><li><span class="tab-tit">E-mail :</span><span><input type="text" name="e-mail" id="em" placeholder="请输入E-mail" autocomplete="off"></span></li><li><span class="tab-tit">留言主题 :</span><span><input type="text" name="zt" id="zt" placeholder="请输入主题" autocomplete="off"></span><span class="tab-des">∗</span></li><li><span class="tab-tit">留言内容 :</span><span><textarea name="content" id="nr" class="" placeholder="请输入留言内容"></textarea></span><span class="tab-des">∗</span></li></ul><div class="table-btn"><input type="button" name="" value="发 表" class="send-btn" id="send"/><input type="reset" name="" value="重 置" class="reset-btn" id="reset" /></div></div>

2,在js中接收数据

/*** Created by dyb on 2018/1/4.*/
function zxly(router,db) {//调用函数接收数据router.get("/action/zxly.js?",function(req,res) {//获取数据库中的数据//req.query:获取URL的查询参数串var par=req.query;var nc=par.nc;var qq=par.qq;var em=par.em;var zt=par.zt;var nr=par.nr;var fsql = "insert into ly_zx(ly_name,ly_qq,ly_email)values(?,?,?)";var tsql = "insert into ly_nr(nr_zt,nr_ly,nr_id)values(?,?,?)";console.log(nc+" "+qq+" "+em+" "+zt+" "+nr);console.log(fsql+" "+tsql);var addfsql=[nc,qq,em];var addtsql=[zt,nr];      //调用外部函数将数据存入数据库db.waterfall(fsql,tsql,addfsql,addtsql,function(result){console.log(result);if(result!=null){res.send({"args":result});}});})}module.exports=zxly;

3,存入数据

db.js

Db.waterfall=function(fsql,tsql,addfsql,addtsql,fun){//从连接池获得连接pool.getConnection(function(err,connection){//开启事务connection.beginTransaction(function(err){if(err){throw err;}//async异步 waterfall函数 瀑布流
                        async.waterfall([function(callback){console.log(fsql);connection.query(fsql,addfsql,function(err,result){if(err){console.log("数据添加失败1:"+err);return}callback(null,result.insertId)})},function(id,callback){//var tsql="insert into ly_nr(nr_zt,nr_ly,nr_id)values("+zt+","+nr+"";
                                addtsql.push(id);console.log(tsql);connection.query(tsql,addtsql,function(err,result){if(err){console.log("数据添加失败2:"+err);connection.rollback();}//提交数据
                                    connection.commit();connection.release();callback(null,'ok')})}],function(err,result){fun(result)})})})}

4,配置路由

app.js

/*** Created by dyb on 2018/1/4.*/
var express = require('express');
var Db=require('./db/db.js');
var app = express();
var url= require("url");
app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');
app.use(express.static( __dirname+"/public"));
var router = express.Router();app.locals.basePath = "http://localhost:3001/";/*直接访问模版需要输入.ejs后辍*/
app.get('/ee/*', function(req, res,next){var pagePath= url.parse(req.url).pathname;if(pagePath.indexOf(".ejs")!=-1){pagePath=pagePath.substr(1);pagePath=pagePath.substr(0,pagePath.length-4);res.render(pagePath);}else {next();}
});var scfk=require('./action/scfk.js');
var p =new scfk(router,Db);var zxly=require('./action/zxly.js');
var p =new zxly(router,Db);app.use("/",router);
var server=app.listen(3001,function afterListen(){console.log("express running ....");
});

转载于:https://www.cnblogs.com/dybe/p/8227780.html

js:nodejs通过async异步提交事务数据相关推荐

  1. nodejs之async异步编程

    2019独角兽企业重金招聘Python工程师标准>>> 1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常 ...

  2. html弹窗赋值给查询框,bootstrap模态框动态赋值, ajax异步请求数据后给id为queryInfo的模态框赋值并弹出模态框(JS)...

    /查询单个 function query(id) { $.ajax({ url : "/small/productServlet", async : true, type : &q ...

  3. 掌握Node.js中的Async和Await

    在本文中,你将学习如何使用Node.js中的async函数(async/await)来简化callback或Promise. 异步语言结构在其他语言中已经存在了,像c#的async/await.Kot ...

  4. node 创建静态web服务器(下)(处理异步获取数据的两种方式)

    接上一章. 上一章我们说创建的静态web服务器只能识别html,css,js文件,功能较为单一,且图片格式为text/html,这是不合理的. 本章,我们将解决该问题. 这里,我们先准备好一个json ...

  5. json请求 post vue_Spring Boot+Vueaxios异步请求数据的12种操作(上篇)

      Java大联盟 致力于最高效的Java学习 关注 Spring Boot + Vue 前后端分离最核心的操作就是通过异步请求完成数据同步,这其中又可以分为很多种不同的情况,比如是 GET 请求还是 ...

  6. python爬斗鱼直播官网,【爬虫】nodejs爬斗鱼直播间数据实战

    前提 $ npm install --save $ node app 打开http://localhost:3030/index.html 可直接查看爬虫数据 目标 爬取斗鱼正在直播的主播数据(房间号 ...

  7. 前端面试题 HTML5 CSS3(盒子模型、盒子水平垂直居中、经典布局) JS(闭包、深浅克隆、数据劫持和拦截) 算法(排序、去重、数组扁平化) Vue(双向数据绑定原理、通信方式)

    前端面试题 HTML5 相关面试题 CSS3 相关面试题 盒子模型 盒子水平垂直居中的方案 经典布局方案 圣杯布局 双飞翼布局 flex布局 定位方式布局 css实现三角形 JS 相关面试题 8种数据 ...

  8. Vue:echarts画图实战,异步获取数据在Vue上使用echarts进行画图

    Vue:echarts画图实战,异步获取数据在Vue上使用echarts进行画图 一.效果图 二.资源 主题编辑器 ECharts 教程 实现代码------想要进行实战的同学可以研究以下代码,下面的 ...

  9. 使用@Async异步注解导致该Bean在循环依赖时启动报BeanCurrentlyInCreationException异常的根本原因分析,以及提供解决方案

    前言 今天在自己工程中使用@Async的时候,碰到了一个问题:Spring循环依赖(circular reference)问题. 或许刚说到这,有的小伙伴就会大惊失色了.Spring不是解决了循环依赖 ...

最新文章

  1. 美国AI语音大牛转投小米!因政治正确遭名校JHU开除,其后怒拒FB百万美元合同...
  2. Spring Data JPA_多表关联查询中应该注意的问题
  3. IT部门的服务工作方式、工作内容有了彻底的改变——安徽移动通信有限责任公司...
  4. Linux whoami指令
  5. 新事务不能登记到指定的事务处理器中异常的处理----MSDTC的正确配置
  6. 猎豹浏览器小号窗口怎么打开 小号窗口打开方法简述
  7. 好程序员Web前端分享一些小知识!
  8. arcgis engine设置数据源路径_不懂ArcGIS,你前期分析用什么做的?
  9. Matlab fftshift and ifftshift and some confusions
  10. 对于一些360文件粉碎无法删除的解决方案
  11. 深信服 AC上网 行为管理设置
  12. 13视频监控-01视频监控布局-videobox
  13. android系统源码学习 -- 蓝牙 bluetooth (一) 入门
  14. 安装java的心得体会_java实训心得体会范文
  15. c++空指针的定义-0L
  16. 邮件附件批量下载小程序
  17. Python爬虫实例(2)--beautifulsoup的应用
  18. 桌面图标文件夹图标隐藏恢复
  19. 除了加班、掉头发,程序员还在承受些什么?
  20. 局域网通过python传输文件

热门文章

  1. 猿匹配 , 一款使用环信实现的一个开源聊天应用含服务器
  2. 软件测试中遇到的印象深刻的问题及反思
  3. 程派高式八卦掌传人——刘树行
  4. 配对t检验的应用条件是什么_配对t检验的适用条件,独立样本T检验、配对T检...
  5. ArcEngine旋转IRotateTracker
  6. 程序员吃饭段子Java吃完就走_爆笑段子:一朋友是个程序员,有一次和他吃饭,他愁眉苦脸的说...
  7. 直达号PK公众号的背后还有哪些市场空间?
  8. 转-零死角玩转stm32-高级篇之SDIO(4bit + DMA、支持SDHC、带协议分析)
  9. OpenCV/C++:点线面相关计算
  10. 华三防火墙透明模式典型组网配置实例