在JavaScript的世界中接剩,所有代碼都是單線程執(zhí)行的撬陵。
由于這個(gè)“缺陷”珊皿,導(dǎo)致JavaScript的所有網(wǎng)絡(luò)操作网缝,瀏覽器事件巨税,都必須是異步執(zhí)行。異步執(zhí)行可以用回調(diào)函數(shù)實(shí)現(xiàn):
Promise對(duì)象代表一個(gè)異步操作粉臊,有三種狀態(tài):
pending 進(jìn)行中
fulfilled 已成功
rejected 已失敗
對(duì)象的狀態(tài)不受外界影響草添,一旦狀態(tài)改變,就不會(huì)再變
Promise對(duì)象的狀態(tài)改變扼仲,只有兩種可能:
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("&");
}
}
請(qǐng)求完成后远寸,可以用.then來執(zhí)行成功后的回調(diào)函數(shù)
用.catch來執(zhí)行失敗后的回調(diào)函數(shù)
Promise.all([p1, p2]).then(function(results){console.log(results);// 獲得一個(gè)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'});
如上,當(dāng)需要多個(gè)異步都執(zhí)行完畢以后執(zhí)行可以用.all.then的回調(diào)函數(shù)執(zhí)行
當(dāng)需要其中的一個(gè)異步操作執(zhí)行完畢以后就可以屠凶,可以用.race