1、同步
var a=3;
var b=4;
console.log(b);
var c=a+b;
console.log(c);
for(var i=0;i<10000;i++){
c+=i;
}
console.log(c);
function fn1(fn){
console.log("a");
fn();
}
function fn2(){
console.log("b");
}
fn1(fn2);
console.log("a");
document.addEventListener("abc",abcHandler);
console.log("b");
var evt=new Event("abc");
document.dispatchEvent(evt);
console.log("d");
function abcHandler(e){
console.log("c");
}
var sum=0;
for(var i=0;i<100000000;i++){
sum+=i;
}
console.log(sum);
console.log("b");
异步
console.log("a");
setTimeout(function(){
console.log("b");
},1000)
console.log("c");
事件 load、error、setTimeOut、setInterval、Promise都是异步
console.log("a");
var img=new Image();
img.addEventListener("load",loadHandler);
img.src="./img/3-.jpg";
console.log("c");
function loadHandler(e){
console.log("b");
}
async、defer
<script src="./js/a.js" async></script>
<script src="./js/b.js" defer></script>
Promise是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法
1、Promise是一个构造函数,所以可以 new 出一个Promise的实例
2、在Promise上有两个函数 resolve(成功之后的回调函数)和 reject(失败后的回调函数)
3、在Promise构造函数的prototype属性上,有一个 .then() 方法。所以只要是Promise构造函数创建的实例,都可以访问到 .then()方法
4、Promise表示一个一步操作,每当我们new一个Promise的实例,这个实例就代表具体的异步操作。
5、Promise创建的实例,是一个异步操作,这个异步操作结果,只有两种结果
1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列
var p=new Promise(function(a,b){
var i=2;
if(i>2){
a();
}else{
b();
}
});
p.then(function(){
console.log("aaa");
},function(){
console.log("bbb");
});
var p=new Promise(fn);
p.then(fn1,fn2);
function fn1(){
console.log("aaa");
}
function fn2(){
console.log("bbb");
}
function fn(a,b){
var i=2;
if(i<2){
a();
}else{
b();
}
}
标准写法
var p=new Promise(function(resolve,reject){
var i=3;
if(i>2){
resolve();
}else{
reject();
}
})
p.then(function(){
},function(){
})
console.log("a");
var p=new Promise(function(resolve,reject){
console.log("b");
resolve();
})
console.log("c");
p.then(function(){
console.log("d");
},function(){
})
console.log("e");
function loadImage(src){
var p=new Promise(function(resolve,reject){
var img=new Image();
img.onload=function(){
resolve(img);
}
img.onerror=function(){
reject(src);
}
img.src=src;
});
return p;
}
var p=loadImage("./img/a.jpg");
var s=p.then(function(img){
console.log(img.width);
},function(src){
console.log(scr+"加载失败");
})
s.then(function(img){
console.log("abcd",img);
},function(){
})
function loadImage(src){
var p=new Promise(function(resolve,reject){
var img=new Image();
img.onload=function(){
resolve(img);
}
img.onerror=function(){
reject(src);
}
img.src=src;
});
return p;
}
var s=loadImage("./img/3-.jpg").then(function(img){
console.log(img.width,img.src);
return loadImage("./img/4-.jpg");
});
s.then(function(img){
console.log(img.width,img.src);
})
loadImage("./img/3-.jpg").then(function(img){
console.log(img.width,img.src);
return loadImage("./img/4-.jpg");
}).then(function(img){
console.log(img.width,img.src);
return loadImage("./img/5-.jpg");
}).then(function(img){
console.log(img.width,img.src);
return loadImage("./img/6-.jpg");
}).then(function(img){
console.log(img.width,img.src);
return loadImage("./img/7-.jpg");
}).then(function(img){
console.log(img.width,img.src);
})
function loadImage(src){
var p=new Promise(function(resolve,reject){
var img=new Image();
img.onload=function(){
resolve(img);
}
img.onerror=function(){
reject(src);
}
img.src=src;
});
return p;
}
Promise.resolve(3).then(function(num){
console.log(num);
});
var p=new Promise(function(resolve,reject){
resolve(3);
});
p.then(function(num){
console.log(num);
});
Promise中状态只能被执行一次
在Promise中resolve和reject,只能被调用一次,不能同时调用
在Promise中有一个状态,就是准备状态pending
var p=new Promise(function(resolve,reject){
resolve(4);
reject(4);
});
p.then(function(num){
console.log(num);
}).catch(function(num){
console.log(num);
})
Promise.reject(4).catch(function(num){
console.log(num);
});
var p=new Promise(function(resolve,reject){
reject(4);
});
p.then(function(){
},function(num){
console.log(num);
})
预加载
1、
function loadImage(src){
var p=new Promise(function(resolve,reject){
var img=new Image();
img.onload=function(){
resolve(img);
}
img.onerror=function(){
reject(src);
}
img.src=src;
});
return p;
}
var arr=[];
for(var i=3;i<80;i++){
var p=loadImage("./img/"+i+"-.jpg");
arr.push(p);
}
Promise.all(arr).then(function(list){
list.forEach(item=>{
console.log(item.width,item.src);
})
})
2、
function loadImage(src){
return new Promise(function(resolve,reject){
var img=new Image();
img.onload=function(){
resolve(img);
}
img.onerror=function(){
reject(src+"这个地址错误");
}
img.src=src;
})
}
function* fn(){
for(var i=3;i<80;i++){
yield loadImage(`./img/${i}-.jpg`);
}
}
var s=fn();
var value=s.next().value;
fns();
function fns(){
value.then(function(img){
console.log(img);
value=s.next().value;
if(value) fns();
})
}
3、
function loadImage(src){
var p=new Promise(function(resolve,reject){
var img=new Image();
img.onload=function(){
resolve(img);
}
img.onerror=function(){
reject(src);
}
img.src=src;
});
return p;
}
async function fn(){
var arr=[];
for(var i=3;i<80;i++){
await loadImage("./img/"+i+"-.jpg").then(function(img){
arr.push(img);
})
}
arr.forEach(item=>{
console.log(item.src,item.width);
});
}
fn();
var p=new Promise(function(resolve,reject){
var i=3;
if(i<2){
resolve(i);
}else{
reject(i);
}
});
p.then(function(i){
console.log(i);
},function(i){
console.log(i);
})
function loadImage(src){
return new Priomse(function(resolve,reject){
var img=new Image();
img.onload=function(){
resolve(img);
}
img.onerror=function(){
reject(img);
}
img.src=src;
});
var arr=[];
for(var i=3;i<80;i++){
arr.push(loadImage("./img/"+i+"-.jpg"));
}
Promise.all(arr).then(function(list){
})
回调地狱
var num=3;
var list=[];
var img=new Image();
img.src="./img/"+num+"-.jpg";
img.onload=function(){
list.push(img);
num++;
img=new Image();
img.src="./img/"+num+"-.jpg";
img.onload=function(){
list.push(img);
num++;
img=new Image();
img.src="./img/"+num+"-.jpg";
img.onload=function(){
list.push(img);
num++;
img=new Image();
img.src="./img/"+num+"-.jpg";
img.onload=function(){
list.push(img);
num++;
img=new Image();
img.src="./img/"+num+"-.jpg";
img.onload=function(){
list.push(img);
num++;
}
}
}
}
}
Promise的作用是处理回调地狱
function loadImage(src){
return new Promise(function(resolve,reject){
var img=new Image();
img.onload=function(){
resolve(img);
}
img.onerror=function(){
reject(src+"地址错误");
}
img.src=src;
})
}
var arr=[];
var num=3;
loadImage("./img/"+num+"-.jpg").then(function(img){
arr.push(img);
num++;
return loadImage("./img/"+num+"-.jpg");
}).then(function(img){
arr.push(img);
num++;
return loadImage("./img/"+num+"-.jpg");
}).then(function(img){
arr.push(img);
num++;
return loadImage("./img/"+num+"-.jpg");
}).then(function(img){
arr.push(img);
num++;
return loadImage("./img/"+num+"-.jpg");
})
function loadImage(src){
return new Promise(function(resolve,reject){
var i=3;
if(i<5){
resolve(i);
}else{
reject(i);
}
})
}
console.log("aaa");
var s=loadImage("./img/3-.jpg").then(function(){
console.log("bbb");
})
console.log("ccc");
console.log("ddd");
console.log(s);
ES7推出async、await
async function fn(){
await Promise.resolve(10).then(function(num){
console.log(num);
})
await Promise.resolve(10).then(function(num){
console.log(num);
})
await setTimeout(function(){
console.log("aaa");
},5000);
await setTimeout(function(){
console.log("bbb");
})
return 10;
}
var p=fn();
p.then(function(num){
console.log(num);
})
红绿灯案例
css样式
div{
width:50px;
height: 50px;
border: 1px solid #cccccc;
background-color: #cccccc;
border-radius: 50%;
float: left;
margin-left: 10px;
}
<div></div>
<div></div>
<div></div>
js
var divs=Array.from(document.querySelectorAll("div"));
var prev;
function setLight(light){
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve(light);
},30000);
});
}
function changeLight(){
setLight("red").then(function(light){
setBackground(0,light);
return setLight("yellow");
}).then(function(light){
setBackground(1,light);
return setLight("green");
}).then(function(light){
setBackground(1,light);
return setLight("light");
})
}
function setBackground(num,light){
if(prev){
prev.style.backgroundColor="#cccccc";
}
prev=divs[num];
prev.style.backgroundColor=light;
}
eventLoop
var x=3;
var y=4;
var z=x+y;
console.log("a");
setTimeout(function(){
console.log("b");
},0);
console.log("c");
new Promise(function(resolve,reject){
console.log("d");
resolve();
}).then(function(){
console.log("e");
})
setTimeout(function(){
console.log(1);
new Promise(function(resolve,reject){
resolve();
}).then(function(){
console.log(2);
})
},0);
setTimeout(function(){
console.log(1);
},0);
setTimeout(function(){
console.log(2);
},50);
new Promise(function(resolve,reject){
resolve();
}).then(function(){
console.log(3);
setTimeout(function(){
console.log(4);
},0);
})
setTimeout(function(){
console.log(1);
new Promise(function(resolve,reject){
resolve();
}).then(function(){
console.log(2);
})
},0);
Promise.resolve().then(function(){
console.log(1);
Promise.resolve().then(function(){
console.log(2);
})
return Promise.resolve();
}).then(function(){
console.log(3);
})
Promise.resolve().then(function(){
console.log(1);
Promise.resolve().then(function(){
console.log(2);
});
Promise.resolve().then(function(){
console.log(3);
});
});
Promise.resolve().then(function(){
console.log(4);
});
async function fn(){
console.log(1);
await Promise.resolve().then(function(){
console.log(2);
})
await Promise.resolve().then(function(){
return 3;
})
await Promise.resolve().then(function(){
console.log(4);
})
}
fn().then(function(num){
console.log(num);
})
console.log(0);
setTimeout(console.log(1),0)
console.log(2);
console.log("1");
new Promise(function(resolve,reject){
console.log("2");
resolve();
}).then(function(){
console.log("3");
});
setTimeout(function(){
console.log("4");
},0);
setTimeout(console.log("6"),1000);
console.log("5");
console.log(1);
document.addEventListener("14",function(){
console.log(14);
});
new Promise(function(resolve){
resolve();
console.log(2);
setTimeout(function(){
console.log(3);
},0);
Promise.resolve().then(function(){
console.log(4);
setTimeout(function(){
console.log(5);
},0);
setTimeout(function(){
(async function(){
console.log(6);
return function(){
console.log(7);
};
})().then(function(fn){
console.log(8);
fn();
});
},0);
});
new Promise(function(resolve){
console.log(9);
resolve();
}).then(function(){
new Promise(function(resolve,reject){
console.log(10);
reject();
}).then(function(){
setTimeout(function(){
console.log(11);
},0);
console.log(12);
}).catch(function(){
console.log(13);
var evt=new Event("14");
document.dispatchEvent(evt);
});
});
});
setTimeout(function(){
console.log(15);
Promise.resolve().then(function(){
console.log(16);
});
},0);