目录
promise与异步
Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理。
同步和异步的不同
同步
当前调用发出之后在没有得到结果之前后续代码不能执行,后续代码一直处于在线等待状态,同步是阻塞的。
代码演示:(1)使用alert介绍同步阻塞
<script>
//同步代码:
console.log(111);
demo();
function demo() {
console.log(222);
alert('Hello');
}
console.log(333);
</script>
异步
当前调用发出之生在没有得到结果之前后续代码可以执行,当前调用的结果会通知、回调函数等方式告诉调用者,异步是非阻塞。
常见的应用场景:(1)网络请求(2)读取文件(3)js中的事件函数就是非常典型的异步表现形式。
代码演示:使用定时器模拟异步感受异步编程的特点。
console.log(11);
test();
function test() {
setTimeout(() => {
console.log(22);
}, 2000);
}
console.log(33);
//异步代码:
console.log(11);
let fn = function(d) {
console.log(d, 888);
}
test(fn);
function test(calls) {
//console.log(calls);
setTimeout(() => {
// console.log(22);
//需求:返回22
calls(22);
}, 2000);
}
console.log(33);
回调函数
在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况被称为回调地狱(或回调)。而往往一些异步操作需要使用回调函数拿到结果
优化前
fn1( function(买彩票){
fn2( function(中奖){
fn3( function(还房贷){
} )
} )
} )
优化后
async function(){
const res1 = await 买了彩票
const res2 = await 中了特等奖500万,等待领奖
const res3 = await 去还房贷
}
//需求:查询某个类别下的所有三级类别
//查询所有一级类别:
$.get('/firstcate', function(d) {
//d为所有一级类别
//查询某一级类别下面的所有二级类别
$.get('/second', {
secid: d[i].firsitId
}, function(d2) {
//d2为某个一级类别下面的所有二级类别
//查询某个二级类别下面所有的三级类别
$.get('/thired', {
thirid: d2[1].secondId
}, function(d3) {
//d3为某个二级类别下面的所有三级类别
});
});
});
promise
Promise(许诺) 是异步编程的一种解决方案,就是一个容器,里面保存着某个未来才会结束的事件。
Promise是异步编程解决方案之一, Promise实际上是一个许诺器,Promise里面通常放的是将来要执行的异步代码,而这些异步代码执行完成后会有两种结果:成功或失败,因此Promise有三种状态:pending(初始状态)、fullfilled/resolved(成功状态)、rejected(失败状态)。当我们在Promise内部调用了成功时的回调函数(resolve()方法)时将Promise的初始状态转换成成功状态,并且执行在then()方法中定义的成功时的回调函数;当我们在Promise内部调用了失败时的回调函数(reject()方法)时将Promise的初始状态转换成失败状态,并且执行在then()方法中或catch()方法中定义的失败时的回调函数
语法
new Promise( (resolve,reject)=>{
// resolve()
// reject()
} )
<script>
// console.log(11);
//resolve:成功时要执行的回调函数
//reject:失败时要执行的回调函数
let prm = new Promise((resolve, reject) => {
// console.log(resolve, 888);
// console.log(reject, 999);
setTimeout(() => {
/