zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    详细解析Windows按键突破专家的原理
    详细解析Windows按键突破专家的原理
    简单线程注入的实现
    运用 Evince 阅读 PDF 电子书
    Sonata 0.7
    P7ZIP-Linux 中的 7Zip
    Firefox 特征扩展:Video Download
    若何在嵌入式Linux及下建造QPF字库
    Wink-Flash 演示录制软件
    自由软件:理想与实践
  • 原文地址:https://www.cnblogs.com/jieru/p/7193366.html
Copyright © 2011-2022 走看看