promise:
promise是一个对象,用来传递异步操作的消息。有了 Promise 对象,
就可以将异步操作以同步操作的流程表达出来。
promise特点:
承诺将来会执行
**防止回调地狱** - Callback Hell
可以进行then的**链式执行**
区分数据请求和数据处理
三种状态
pending:等待中,或者进行中,表示还没有得到结果
resolved(fullfilled):已经完成,表示得到了我们想要的结果,可以继续往下执行
rejected:也表示得到结果,但是由于结果并非我们所愿,因此拒绝执行
调用时会被传递两个参数:resolve和reject函数
具备then()方法,对于then()方法有以下简单的要求:
接收完成态、错误态的回调方法
可选地支持progress事件回调作为第三个方法
只接受function对象
返回Promise对象,以实现链式调用
var ajaxOptions = {
url: '#',
method: 'GET',
async: true,
timeout: 0,
data: null,
dataType: 'text',
headers: {},
onprogress: function (){},
ouploadprogress: function() {},
xhr: null
}
var promiseAjax = (optionsOverride) => {
var options = {};
for (var k in ajaxOptions) {
options[k] = optionsOverride[k] || ajaxOptions[k];
}
options.async = options.async === false ? false : true;
var xhr = options.xhr = options.xhr || XMLHttpRequest ? new XMLHttpRequest() : new window.ActiveXObject('Microsoft.XMLHTTP');
return new Promise((reslve, reject) => {
xhr.open(options.method, options.url, options.async);
xhr.timeout = options.timeout;
for (var k in options.headers) {
xhr.setRuquestHeader(k, options.headers[k]);
}
xhr.onprogress = options.onprogress;
xhr.upload.onprogress = options.onuploadprogress;
xhr.responseType = options.dataType;
xhr.onloadend = function () {
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304){
resolve(xhr.responseText, xhr);
}else{
var resJson = {
code: xhr.status,
response: xhr.response
}
reject(resJson, xhr)
}
}
try {
xhr.send(options.data);
}
catch (e) {
reject({
errorType: 'send_error',
error: e
});
}
})
}