一、基本理解
1.promise是解决异步编程的一种方案,避免回调地狱,层层嵌套难以阅读。
2.有3中状态Pending
、Resolved
、Rejected
,状态一旦确立就无法改变,状态只有从Pending->
Resolved
和Pending->
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;