同步,异步?
js是同步阻塞单线程运行的,so?需要等待,然后就出现了很多异步的操作需要同步等待执行,比如请求数据是异步的(这个是都会遇到的),这个时候就需要我们异步转同步。
Promise
将异步的操作转换成同步,解决了回调地狱的问题,看起来更优雅
三种状态:
reject: 拒绝,后面的将不会执行
resove: 成功,会执行后面的,可以传参 参数会传入下一个链式调用的方法里面
pendding:加载中,还未完成
直接根据例子来分析吧:
let p = new Promise(function (resolve, reject1) {
setTimeout(function () {
console.log('111');
resolve('传过去的数据data');
},1000)
}).then(function (data) {
console.log('2222');
console.log('传过来的数据',data);
return Promise.reject();
}).then(function () {
console.log('333');
}).catch(function (e) {
console.log('error', e);
});
上面代码一个简单的promise实例,会在1s后打印111,然后打印2222,然后并不会打印333,第一个then接受的参数是由上面创过来的,第一个then里面使用Promise.reject()来中断后续的操作,这就是then的链式调用。
async/await
async/await是es7的新标准,它是基于Promise语法糖的,因为await后面接的函数调用必须是返回了Promise对象的函数。不过相对于Promise更简单,只需要在将函数用async修饰,然后函数内部使用await(即等待的意思)。
上例子看效果吧:
async function test() {
//await的返回必须是Promise对象才能由作用
await t1();
console.log('t1结束');
await t2();
console.log('t2结束');
t3();
t4();
}
async function t1() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log('t1');
resolve();
}, 1000);
})
}
function t2() {
return new Promise(function (resolve,reject) {
setTimeout(function () {
console.log('t2');
resolve();
}, 1000);
})
}
function t3() {
setTimeout(function () {
console.log('t3');
}, 1000)
}
function t4() {
setTimeout(function () {
console.log('t4');
}, 1000)
}
test();
效果:
上面例子的t3就没有返回Promise对象 就不会等待 直接t4就跟着出来啦
总结:
还是async/await用起来舒服点,可读性也要高点,其次Promise,再次的话就回调吧,如果是老项目考虑兼容性的话还写规范点吧,尽量少些一些回调,用回调的话有时候代码多或者事件久连自己不知道在哪里调用的啦。 不过现在 好多都是直接用框架啦,就可以用Promise和async/await了!