回掉地狱:多次在内部递归调用外部函数的返回结果值。
Promise对象三种状态
- pending:等待中,或者进行中,表示还没有得到结果
- resolved:已经完成,可以继续执行
- rejected:得到非我所愿结果,拒绝执行
在Promise对象的构造函数中,构造函数的第一个参数为函数,用来处理Promise的状态变化。1
2
3
4new Promise(function(resolve, reject) {
if(true) { resolve() }; // 对应resolved状态
if(false) { reject() }; // 对应rejected状态
})
Promise对象中的then方法
then方法接收构造函数中的处理的状态变化
then方法有2个参数,第一个参数接收resolve状态的执行,第二个参数接收reject状态的执行。
1 | function fn(num) { |
Promise的then的链式调用(解决回调地狱的一种方式)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16function fn(num) {
return new Promise(function(resolve, reject) {
if (typeof num == 'number') {
resolve();
} else {
reject();
}
})
.then(function() {
console.log('参数是一个number值');
}).then(null, function() {
console.log('参数不是一个number值');
})
}
fn('hahha');
fn(1234);
Promise中的数据传递
1 | var fn = function(num) { |
多次Ajax请求,后序请求调用前边请求的返回数据,使用Promise对象:
返回正确结果,resolve一下,错误结果reject一下
如reject(e),resolve(response),reject(new Error(XHR.statusText))
1 | var url = 'https://hq.tigerbrokers.com/fundamental/finance_calendar/getType/2017-02-26/2017-06-10'; |
Promise.all
一个Ajax请求需要2个或者更多请求都有返回结果之后才能确定,用Promise.all,其中参数是以Promise对象组成的数组1
2
3
4
5
6
7
8var url = 'https://hq.tigerbrokers.com/fundamental/finance_calendar/getType/2017-02-26/2017-06-10';
var url1 = 'https://hq.tigerbrokers.com/fundamental/finance_calendar/getType/2017-03-26/2017-06-10';
function renderAll() {
return Promise.all([getJSON(url), getJSON(url1)]);
}
renderAll().then(function(value) {
console.log(value);
})
只有当所有的Promise对象都变为resolved或者rejected的时候,才会调用then方法
Promise.race
与Promise.all相同,以Promise对象组成的数组作为参数,但是当Promise其中一个Promise状态变为resolved或者rejected,就可以调用.then方法1
2
3
4
5
6function renderRace() {
return Promise.race([getJSON(url), getJSON(url1)]);
}
renderRace().then(function(value) {
console.log(value);
})
参考文章:
Promise——这波能反杀
如有错误,烦请指正,谢谢!