最近整理代码,对一些异步js方法不熟悉,百度了一下做了整理方便查阅。
1.setTimeout
一个延时执行的方法,经常会用到,但很多时候在实际使用上很不严谨,只是对耗时久的等待随手做个500毫秒的延时使功能可以跑通,但对于代码到底需要执行多久和不同电脑执行速率没有任何处理。
2.script 属性
defer:当页面加载完才去执行这段代码,用于后引入一些js的场景另外 async:异步执行script代码
3.动态创建script标签
感觉不是很实用,没做记录。
4.回调函数(callback)
利于理解部署但不利于阅读维护,注意区分同步回调与异步回调
例:f2()等待f1()的执行结果,f1()是耗时长的函数,改写为f2为f1的回调
function f1(callback){setTimeout(function(){callback()},1000)} 执行:f1(f2())
5.事件监听
监听函数有:on,bind,listen,addEventListener,observe
例(采用jquery写法)
f1.on('done',f2) 当f1发生done事件就执行f2
function f1(){setTimeout(function(){..... f1.trigger('done');},100}
f1.trigger('done')表示执行完成后,立即触发done事件,从而开始执行f2
例:onclick方法
element.onclick=function(){} 缺点是当一个element绑定多个事件时,只有最后一个事件会被添加,所以添加事件用以下方法:
element.attachEvent("onclick",f1) Ie写法
element.addEvenListener("click",f1,false) 标准写法 第三个参数是泡沫获取,false由里向外,反之
6.发布、订阅模式,又称观察者模式
一个jquery插件的例子:
jQuery.subscribe("done",f2) : f2向信号中心订阅done信号
function f1(){setTimeout()=>{...........jquery.publish("done")},1000}
jquery.publish("done")是f1执行完后向信号中心发布的done信号从而引发f2执行
取消订阅:jquery。unsubscribe("done",f2)
类似于事件监听,但可通过查看消息中心了解有多少信号,每一个信号有多少订阅者等。
7.promise对象(promise模式)
promise是一种模式,可以帮助管理异步方式返回代码
promise有两种状态:等待(pending)完成(settled),promise会一直处于等待状态,直到它所包装的异步调用返回或超时或结束,然后promise状态变为完成,完成状态分为两类:解决(resolved)拒绝(rejected)
例: var p =new Promise(function(resolved))
settimeout(function(){var result=10*5;
if(result===50){resolve(50)
}else{
reject(new Error('Bad Math'))},1000)
})
p.then(function(result){console.log(resulr)})
p.catch(function(){console.error('wrong')})
resolve告诉用户promise已解决,reject函数未能顺利完成
上边网上的实例没运行成功,下边这个亲测好使
var mm=new Promise((resolve,reject)=>{setTimeout(()=>{let a=5*10if(a==50){resolve(a)}else{reject("errow")},2000}
mm.then((e)=>{console.log(e)})
mm.catch((e)=>{console.log(e)})
8.async/await
async用来声明异步函数,返回的是promise对象,如果函数返回的不是promise会自动用promise.resolve()包装
await等待右侧表达式结果,如果等到的不是promise对象,那运算结果就是他等到的东西,如果等到promise对象他会阻塞后边的代码,等待promise对象resolve得到它的值,所以为了避免阻塞代码,await必须在async中
例:function test(){return new Promise (resolve=>{setTimeout(()=>{resolve("test")},2000)})
async function test2(){const result=await test()console.log(result)}
test 2()
console.log('end')
//end test