promise浅析

解释

Promise 是一个 javascript 对象,它代表了一个异步操作的最终完成或者失败。常用于控制异步操作的执行顺序,而且可以让异步方法像同步方法那样返回值。它不能立即取得异步方法的返回值,但是它可以代理这个值,一旦异步操作完成,就会以及将值传递给相应的处理方法。

ES6 的Promise对象是一个代理对象,被代理的值在Promise对象创建时可能是未知的,另外它允许你为异步操作的成功和失败分别绑定相应的处理方法。

用途

1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果

3、可以在对象之间传递和操作promise,帮助我们处理队列

状态

方法

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var mysql = require('mysql');
const { dbConfig } = require('../config.js');
var pool = mysql.createPool(dbConfig);

var db = {};

db.q = function (sql,params) {
return new Promise((resolve,reject)=>{
// 取出链接
pool.getConnection(function(err, connection) {
if (err) {
reject(err);
return;
}
connection.query(sql,params, function (error, results) {
// 释放连接
connection.release();
if(error) {
reject(err);
return;
}
resolve(JSON.parse(JSON.stringify(results)));
});
});
});
}

// 导出对象
module.exports = db;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
const URL_ERR = "地址错误"
const METHOD_GET = "GET"
const DEFAULT_CONTENT_TYPE = "application/json;charset=utf-8"

const myaxios = (url, ...arg) => {
let options = arg[0]

return new Promise((resolve, reject) => {
// 参数检测
let err = vaildContent(url, options)
if (err) {
reject(err)
}
// 参数解析
let type = (options && options.method) ? options.method : METHOD_GET
let contentType = (options && options.header) ? options.header : DEFAULT_CONTENT_TYPE
// application/x-www-form-urlencoded
// application/json
// ...
let params = setParams(contentType, options)
let sUrl = setUrl(url, options)
// 请求
var xhr = new XMLHttpRequest();
console.log(type, sUrl, contentType);

xhr.open(type, sUrl, true);
xhr.setRequestHeader("Content-Type", contentType);
xhr.send(params);
xhr.onreadystatechange = function() {
console.log(xhr.readyState);
if (xhr.readyState == 4) {
if (xhr.status === 200) {
resolve(JSON.parse(xhr.responseText))
} else {
// console.log(xhr);
let errObj = { status: xhr.status, errText: xhr.statusText }
if (xhr.responseText) errObj.errObj = errObj
reject(errObj)
}
}
};
})
}
const vaildContent = (url, opt) => {
if (!url) {
return URL_ERR
}
// TODO
return null
}
const setParams = (contentType, opts) => {
// contentType 对应不同的编码格式;这里默认JSON
return opts.data ? JSON.stringify(opts.data) : null
}
const setUrl = (url, opts) => {
let params = opts.params
if (!params) return url
// json
if (opts.method.toUpperCase() == "GET") {
let key = ""
for (let i in params) {
key += `&${i}=${params[i]}`
}
key = "?" + key.slice(1)
return url + key
}
}

上次更新 2021-01-28