一why:为什么要使用promise机制?
二what: promise机制是什么?
三how:如何使用promise机制?
为什么要使用promise机制?
一why:为什么要使用promise机制?
为了解决js中异步编程的毛病:
1嵌套太深代码可读性太差
2并行逻辑必须串行执行
二what: promise机制是什么?
每个promise都有三个状态:pending(默认)、fulfilled(完成)、rejected(失败);默认状态可以转变为完成态或失败态,完成态与失败态之间无法相互转换,转变的过程是不可逆的,转变一旦完成promise对象就不能被修改。通过promise提供的then函数注册onFulfill(成功回调)、onReject(失败回调)、onProgres(进度回调)来与promise交互。Then函数返回一个promise对象(称为promise2,前者成为promise1),promise2受promise1状态的影响,具体请查看A+规范。
三how:如何使用promise机制?
request = function(url, cb, eb) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if ((xhr.status >=200 && xhr.status < 300) || xhr.status === 304) {
cb(xhr.responseText);
} else {
eb(new Error({
message: xhr.status
}));
}
}
};
xhr.open('get', url, true);
xhr.send(null);
}
2 request('data1.json', function(data1){
3 console.log(data1);//处理data1
4 request('data2.json', function(data2) {
5 console.log(data2);//处理data2
6 request('data3.json', function(data3) {
7 console.log(data3);//处理data3
8
9 alert('success');
10 }, function(err) {
11 console.error(err);
12 });
13 }, function(err) {
14 console.error(err);
15 });
16 }, function(err) {
17 console.error(err);
18 });
promise方式:
request = function(url) {
var def = new Deferred();
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if ((xhr.status >=200 && xhr.status < 300) || xhr.status === 304) {
def.resolve(xhr.responseText)
} else {//简化ajax,没有提供错误回调
def.reject(new Error({
message: xhr.status
}));
}
}
};
xhr.open('get', url, true);
xhr.send(null);
return def.promise;
}
request('data1.json').then(function(data1) {
console.log(data1);//处理data1
return request('data2.json');
}).then(function(data2) {
console.log(data2);//处理data2
return request('data3.json');
}, function(err) {
console.error(err);
}).then(function(data3) {
console.log(data3);
alert('success');
}, function(err) {
console.error(err);
});
//并行逻辑串行执行
request('data1', function(data1) {
request('data2', function(data2) {
request('data3', function(data3) {
console.log(data1, data2, data3);//处理全部数据
alert('success');
}, function(err) {
console.error(err);
});
}, function(err) {
console.error(err);
});
}, function(err) {
console.error(err);
});
promise方式
//所有异步操作都完成时,进入完成态,
//其中一项异步操作失败则进入失败态
all = function(requestArray) {
// var some = Array.prototype.some;
var def = new Deferred();
var results = [];
var total = 0;
requestArray.some(function(r, idx) {
//为数组中每一项注册回调函数
r.then(function(data) {
if (def.promise.isPending()) {
total++;
results[idx] = data;
if (total === requestArray.length) {
def.resolve(results);
}
}
}, function(err) {
def.reject(err);
});
//如果不是等待状态则停止,比如requestArray[0]失败的话,剩下数组则不用继续注册
return !def.promise.isPending();
});
return def.promise;
}
all(
[request('data1.json'),
request('data2.json'),
request('data3.json')]
).then(
function(results){
console.log(results);// 处理data1,data2,data3
alert('success');
}, function(err) {
console.error(err);
});