• es6-Promise对象学习


    一、基本理解

    1.promise是解决异步编程的一种方案,避免回调地狱,层层嵌套难以阅读。

    2.有3中状态PendingResolvedRejected,状态一旦确立就无法改变,状态只有从Pending->ResolvedPending->Rejected这两种情况。

    3.缺点:一旦新建它就会立即执行,无法中途取消;如果不设置回调函数,Promise内部抛出的错误,不会反应到外部;当处于Pending状态时,无法得知目前进展到哪一个阶段。

    4.then函数返回的是另一个新的promise对象,所以可以一直then下去,下一个then回调函数的参数是上一个then回调函数返回的结果。

    5.假如then返回的值是另一个promise的话,则下一个then的回调函数会根据这个promise对象的状态来执行相应的回调,只有状态改变才会执行,否则会一直等待。

    6.好的写法是通过reject去抛出异常和错误,用catch去捕获错误,catch除了捕获reject里面抛出的异常以外,还会捕获then回调里面抛出的错误。

    二、我的例子

    该例子是一个读取数据库的封装,使用的是nodejs

    1.这是一个model类,构造函数是链接数据库的操作,query方法执行相应的sql操作并返回一个promise对象

    'use strict'
    let mysql = require('mysql');
    let moment = require('moment');
    moment.locale('zh-cn');
    let fs = require('fs');
    class Model {
        constructor() {
            this.dbConfig = {};
            try {
                this.dbConfig = fs.readFileSync('config/dbconfig.json', 'utf-8');
                this.dbConfig = JSON.parse(this.dbConfig);
            } catch (err) {
                fs.appendFile('logs/' + moment().format('L') + '-mysql.txt', 'ERROR: ' + err + '
    ', () => {});
            }
            this.pool = mysql.createPool(this.dbConfig); //建立地址池
        }
        query(sql, param) { //父类的query方法
            var promise = new Promise((resolve, reject) => {
                this.pool.getConnection((err, conn) => { //地址池连接
                    if (err) {
                        fs.appendFile('logs/' + moment().format('L') + '-mysql.txt', 'ERROR: ' + err + '
    ', () => {});
                        reject(err); //如果有错误则传错误 
                    } else {
                        let res = conn.query(sql, param || [], (qerr, vals, fields) => { //如果连接池打开正常,则执行语句
                            //释放连接  
                            conn.release();
                            //事件驱动回调  
                            resolve(vals);
                            res = null; //释放资源
                        });
                    }
                });
            });
            return promise;
        }
    module.exports = Model;

    2.GoodsTypeModel 和SearchModel 继承model这个父类,并拥有属于自己的方法

    let Model = require('../vendor/model');
    class GoodsTypeModel extends Model {
        getAll() {
            return this.query('select id,name,parentid from goods_type');
        }
    }
    module.exports = GoodsTypeModel;
    let Model = require('../vendor/model');
    class SearchModel extends Model {
        add(param) {
            return this.query('insert into search set ?,create_time=now()', param);
        }
        getKeyList(param) {
            return this.query('select keyword from search where uid=? group by keyword ORDER BY count(id) DESC limit 0,6', param);
        }
    }
    module.exports = SearchModel;

    3.在express的router中使用

    var express = require('express');
    var router = express.Router();
    let GoodsTypeModel = require('../Model/GoodsTypeModel');
    let SearchModel = require('../Model/SearchModel');
    let common = require('../util/common');
    /* GET home page. */
    router.get('/', function(req, res, next) {
        let goodstypemodel = new GoodsTypeModel();
        goodstypemodel.getAll().then((result) => {
            let searchmodel = new SearchModel();
            result = common.delayering(result, 0);
            res.render('index', { title: JSON.stringify(result) });
            return searchmodel.getKeyList(112);
        }).then((result) => {
            console.log(JSON.stringify(result));
        })
    });
    module.exports = router;
  • 相关阅读:
    运算符重载
    poj2329dfs
    poj2349最小生成树prim
    poj1258最小生成树prim
    read 一个防止找不到就写一下的输入模板
    CentOS7下安装ngnix
    CentOS7下安装mysql
    CentOS7下安装rabbitmq
    在window 2008r2开发服务器上安装MSMQ消息队列
    spark快速大数据分析学习笔记(1)
  • 原文地址:https://www.cnblogs.com/jieru/p/7193366.html
Copyright © 2020-2023  润新知