在JavaScript的世界中,所有代码都是单线程执行的。
由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现:
Promise对象代表一个异步操作,有三种状态:
pending 进行中
fulfilled 已成功
rejected 已失败
对象的状态不受外界影响,一旦状态改变,就不会再变
Promise对象的状态改变,只有两种可能:
pending => fulfilled
pending => rejected
---------------------
function getAjax(type, url, data) {
return new Promise(function(resolve, reject) {
var xhr = null
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open(type, url, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
resolve(JSON.parse(xhr.responseText));
} else {
reject(xhr)
}
}
if (type == 'GET') {
xhr.send()
} else {
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(formatParams(data));
}
})
function formatParams(data) {
var arr = [];
for (var name in data) {
arr.push(name + '=' + data[name]);
}
return arr.join("&");
}
}
请求完成后,可以用.then来执行成功后的回调函数
用.catch来执行失败后的回调函数
Promise.all([p1, p2]).then(function(results){console.log(results);// 获得一个Array: ['P1', 'P2']});
varp1 =newPromise(function(resolve, reject){setTimeout(resolve,500,'P1');});
varp2 =newPromise(function(resolve, reject){setTimeout(resolve,600,'P2');});
Promise.race([p1, p2]).then(function(result){console.log(result);// 'P1'});
如上,当需要多个异步都执行完毕以后执行可以用.all.then的回调函数执行
当需要其中的一个异步操作执行完毕以后就可以,可以用.race