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 + '\n', () => {});
        }
        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 + '\n', () => {});
                    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;

 

posted @ 2017-07-17 11:10  25洁如  阅读(410)  评论(0编辑  收藏  举报