1.promise:
promise
顾名思义,承诺的意思,承诺你呢,现在还得不到一个结果,未来给你结果,雾草,渣男
-
当前事件循环得不到的结果,但未来的事件循环会给你结果
-
状态机:
pending
fulfilled/resolved
rejected
🚀 1.状态机简单代码示例:
var promise = new Promise(function (resolve, reject) {
setTimeout(()=>{
resolve();
},500)
});
console.log(promise);
setTimeout(() => {
console.log(promise);
},800);
执行 node index.js
后结果如下图:
通过立即执行函数在控制台运行结果:
(function () {
var promise = new Promise(function (resolve, reject) {
setTimeout(() => {
resolve();
}, 500);
});
console.log(promise);
setTimeout(() => {
console.log(promise);
}, 800);
})();
控制台结果如下图:
2..then
和.catch
用法:
resolved
状态的Promise
会回调后面的第一个.then
rejected
状态的Primise
会回调后面的第一个.catch
.then
和.catch
方法中的return
的结果会被包装为promise
- 任何一个
rejected状态
且后面没有.catch
的promise
,都会造成浏览器/node
环境的全局错误
3.使用promise解决异步回调地狱问题:
🚀例子1:primise的基本使用:
(function(){
var promise = interview();
promise.then((res)=>{
console.log('哇~幸福来得太突然了');
}).catch((err)=>{
console.log('失败了,再来',err);
});
function interview(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
if(Math.random() > 0.2){
resolve('表白成功了')
}else{
reject(new Error('表白失败了'))
}
},500)
})
}
})();
🚀例子2:回调函数return promise的情况
(function(){
var promise = interview();
var promise2 = promise.then((res)=>{
return new Promise(function(resolve,reject){
setTimeout(()=>{
resolve('第二次表白了')
},400)
})
});
setTimeout(()=>{
console.log(promise);
console.log(promise2);
},800);
setTimeout(()=>{
console.log(promise);
console.log(promise2);
},1000);
function interview(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
if(Math.random() > 0.2){
resolve('表白成功了')
}else{
reject(new Error('表白失败了'))
}
},500)
})
}
})();
- 执行
interview
需要400毫秒
,进入第二次告白需要等500毫秒
,一共是900毫秒
- 通过在
800
和1000
毫秒时打印promise
和promise2
;会发现800毫秒
时的promise2
出于pending
,而在1000毫秒
时转为fulfilled
🚀例子3:多次表白的情况:
(function () {
var promise = interview(1)
.then(() => {
return interview(2);
})
.then(() => {
return interview(3);
})
.then(() => {
console.log('哇,终于等到你~!');
})
.catch((err) => {
console.log('我在第' + err + '次表白的时候失败了');
});
function interview(round) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.2) {
resolve('表白成功了');
} else {
var error = new Error('fail');
error.round = round;
//记录表白失败的轮次数
reject(round);
}
}, 500);
});
}
})();
结果如下图:
🚀例子4:并发问题的处理:
(function () {
Promise.all([interview('腾讯'), interview('阿里'), interview('京东')]).then(()=>{
console.log('面试都通过了呢')
}).catch(
(err) => {
console.log('我在' + err + '的面试失败了');
}
);
function interview(name) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.2) {
resolve('表白成功了');
} else {
var error = new Error('fail');
error.round = name;
//记录表白失败的轮次数
reject(name);
}
}, 500);
});
}
})();