zoukankan      html  css  js  c++  java
  • Nodejs中使用异步流程控制Async

      首先,我们都知道,Node基于事件驱动的异步I/O架构,所谓异步就是非阻塞,说白了就是一个事件执行了,我不必等待它执行完成后我才能执行下一个事件。所以在Node环境中的模块基本都是异步的,上一篇说到我在项目中改用了easymysql模块代替mysql模块,两个模块作查询的操作都是异步的,所以要实现嵌套查询往往会很麻烦,而且很大可能会报错。为此,为了实现查询同步,我引进了异步流程控制async模块,让js异步操作变成同步操作,这样一方面方便阅读理解,另一方面能够很好实现需求的目标,亲测有效~

    update.js文件

     1 'use strict'
     2 var async = require('async');
     3 var Client = require('easymysql');
     4 var mysql = Client.create({
     5     'maxconnections': 10
     6 })
     7 mysql.addserver({
     8     host: 'localhost',
     9     user: 'test',
    10     password: '123456',
    11     database: 'database'
    12 })
    13 
    14 exports.match = function(req, res) {
    15     //获得需要所有记录信息
    16     function getInfo() {
    17         return new Promise((resolve, reject) => {
    18             mysql.query('SELECT `index`,`name` from tableA', function(err, result) {
    19                 if (err) {
    20                     console.log(err);
    21                 } else {
    22                     resolve(result);
    23                 }
    24             })
    25 
    26         })
    27     }
    28 
    29     // 将每一项的名字更新为gdt
    30     function updateName(info) {
    31         return new Promise((resolve, reject) => {
    32             var index = info['index'];
    33             var sql = "UPDATE  `tableA` SET `tableB`.`name` = 'gdt' WHERE `tableA`.`index` =" + index;
    34             mysql.query(sql, function(err, result) {
    35                 if (err) {
    36                     console.log(err);
    37                 } else {
    38                     resolve('更新成功');
    39                 }
    40             })
    41         })
    42     }
    43 
    44     async function update() {
    45         let result = '';
    46         //筛选出在公屏发言出现的环球uid和其对应的index
    47         var getinfoResult = await getInfo();
    48         for (let i = 0; i < getinfoResult.length; i++) {
    49             var updateResult = await updateName(getinfoResult[i]);
    50             console.log(updateResult);
    51         }
    52         return result ? result : 'success';
    53     }
    54 
    55     update().then(function(result) {
    56         console.log(result);
    57 
    58         //断开数据库连接
    59         connection.end();
    60     })
    61 }

    .babelrc文件(使用ES7的Async/Await需要进行babel转码)

    {
      "presets": [
        "stage-0"
      ],
       "plugins": ["transform-async-to-generator"]
    }

      以上代码只是举例,主要是来说明async的使用,并不能直接运行,实现的需求应该很容易理解,就是在table表中找到所以记录的index和name字段,存放在

    getinfoResult变量中,然后该变量遍历每一项,进行更新操作。因为有了async流程控制将getInfo()和updateName(getinfoResult[i])两个异步操作改成同步进行,这样程序运行起来才不会因为异步的原因而报错。

    关于async的详细可以查看阮一峰大神的教程: 异步操作和Async函数

  • 相关阅读:
    nyoj 115------城市平乱( dijkstra // bellman )
    nyoj-----284坦克大战(带权值的图搜索)
    nyoj-----42一笔画问题
    hdu-------1081To The Max
    nyoj------170网络的可靠性
    HDUOJ-------1052Tian Ji -- The Horse Racing(田忌赛马)
    初学Java之Pattern与Matcher类
    初学java之StringBuffer类的常用方法
    初学java之大数处理
    hdu---1024Max Sum Plus Plus(动态规划)
  • 原文地址:https://www.cnblogs.com/DTBelieve/p/5656115.html
Copyright © 2011-2022 走看看