看個(gè)對(duì)ajax的簡(jiǎn)單模仿,當(dāng)然真正的ajax并不是這樣實(shí)現(xiàn)的:
function ajax(object){ //
console.log("start ajax --------");
object.success("data is '" + object.data + "' and acrossAjax");
}
ajax({
data: 'milk',
success: (data) => {
console.log(data);
}
});
控制臺(tái) 輸出:
start ajax --------
data is 'milk' and acrossAjax
當(dāng)我們?cè)谝粋€(gè)ajax 中依賴上一個(gè)請(qǐng)求的參數(shù)需要進(jìn)行下一次的ajax請(qǐng)求時(shí)會(huì)怎么做呢?
ajax({
data: 'milk',
success: (data) => {
console.log(data);
ajax({
data: data,
success: (data) => {
console.log(data);
}
});
}
});
控制臺(tái)輸出:
start ajax --------
data is 'milk' byAjax
start ajax --------
data is 'data is 'milk' byAjax' byAjax
這樣子看起來(lái) 代碼已經(jīng)不太直觀了,層層嵌套。這還只是兩層,如果是三層 或則更多呢? 這就引出了promise
再讓我們來(lái)看看promise 對(duì)這種情況是怎么實(shí)現(xiàn)的
/*********************** es6 promise start ********************/
function ajax(object){ // 封裝一個(gè)支持promise的ajax
let promise = new Promise((resolve, reject) => {
console.log('start promise -----');
resolve("data is '" + object.data + "' byAjax");
});
return promise;
}
ajax({
data: 'milk',
})
.then((data) => {
console.log(data);
return data; // 返回普通變量對(duì)象 這時(shí)then返回的是一個(gè)初始的promise對(duì)象,不是ajax 這個(gè)
})
.then((data) => {
console.log(data);
return ajax({data: data}); // 返回新的 ajax promise對(duì)象
})
.then((data) => {
console.log(data);
});
控制臺(tái)輸出:
start promise -----
data is 'milk' byAjax
data is 'milk' byAjax
start promise -----
data is 'data is 'milk' byAjax' byAjax