[个人笔记-js的异步方法总结]

265 阅读3分钟

最近整理代码,对一些异步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