Promise的产生源于JavaScript对异步编程的需求,以前的js,都是单线程的,但是,ajax技术出来之后,异步就成了网络请求中的主流。
当我们需要确保某段代码在谁谁之后执行,我们就可以利用函数调用栈,将我们想要调用的代码放入回掉函数之中。
function test() {
console.log('想要调用的代码')
}
function callback(test) {
//.........之前调用的代码
test();
}
这样的话,就造成了传说中的回调地狱。代码可读性及其差。
ar fn = function(num) {
return new Promise(function(resolve, reject) {
if(typeof num == 'number') {
resolve(num)
} else {
reject('TypeError')
}
})
}
fn(2).then(function(num) {
console.log('first:' + num)
return num + 1
}).then(function(num) {
console.log('second:' + num)
return num + 1
}).then(function(num) {
console.log('third:' + num)
return num + 1
})
引入Promise之后的写法就相对可读性好一点。Promise对象有三个状态,pending、resolved、rejected。Promise对象的回调函数中reject()和resolve()是两个状态修改方法。pending只能修改为resolved或者rejected。
reject() 表示收到了结果,但不是期望的,将状态修改为拒绝(rejected)
resolve() 表示收到了结果,是预期的,将状态改为完成(resolved)
.then(resolve, reject) then函数是对于promise状态修改之后的操作函数,它接受两个回调函数,第一个参数是表示状态为resolved时执行。第二个为状态为rejected时执行。所以第二个参数一般不写,用.catch()捕获异常。即.then(null, function() {}) == .catch(){}
.all() 接受一个Promise队列数组,当数组中的Promise对象状态全部改变时才执行then方法。
.race() 和all方法相反,只要有一个promise对象状态改变,就执行then方法。
var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // [3, 1337, "foo"]
});