2020-04-09 16:08发布
异步加载的方式有哪些呀
异步加载又叫非阻塞加载,浏览器在下载执行js的同时,还会继续进行后续页面的处理。主要有三种方式。
方法一:也叫Script DOM Element
方法二:onload时的异步加载
方法三:其他方法:由于JavaScript的动态性,还有很多异步加载方法: XHR Injection、 XHR Eval、 Script In Iframe、 Script defer属性、 [removed](script tag)。
利用回调函数
利用promise配合async和await
1.Generator函数 状态机 (生成器)
概念: Generator 的中文名称是生成器,它是 ECMAScript6 中提供的新特性。 Generator 函数是 ES6 提供的一种异步编程解决方案,在过去,封装一段 运算逻辑的单元是函数。函数只存在“没有被调用”或者“被调用”的情况,不存 在一个函数被执行之后还能暂停的情况,而 Generator 的出现让这种情况成 为可能,我们可以把 Generator 函数理解成状态机,封装了多个内部状态。
语法:
1. function 后面需要加 *
eg:
function* generator()
2. 函数内需要使用 yield 表达式来描述状态
调用:
我们调用了 generator 函数之后,会返回一个 iterator 对 象,随后需要调用 next 方法, 才会看到结果, next 方法遇到 yield 就 会暂停,需要再次调用。
yield关键字:
1. 真正让Generator具有价值的是yield关键字,这个yield关键字让 Generator内部的逻辑能够切割成多个部分。
2. yield 表达式后面的状态,会在 next 方法返回的对象中的 value 上出 现
3. yield 表达式本身是没有值的,如果想要让表达式有值的话,我们可以 向 next 方法传参,通过 .next() 传递参数,可以赋值给 yield 关键字前 面的变量声明。
4. next 方法传参时是针对上一个 yield 生效的
let compute = function* (a, b) {
var foo = yield a + b;
console.log(foo);
};
let generator = compute(4, 2);
generator.next(); // {value: 6, done: false}
generator.next("Hello world!"); //Hello world! {val ue: undefined, done: true}
拓展:同步异步问题 1. 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完 毕,才能执行后一个任务; 2. 异步任务指的是,不进入主线程、而进入”任务队列”的任务,只有等主 线程任务执行完毕,”任务队列”开始通知主线程,请求执行任务,该任 务才会进入主线程执行。
2.Promise
概念:
promise 也是 es6 提供的一种异步编程的解决方案,语法和使用场景要比 generator 优秀。
使用方式:
1. 是一个构造函数 , 所以要 new Promise() 2. 需要使用 then 方法来接受成功或失败的结果
eg:
var promise = new Promise((resolve, reject)=>{})
promise .then( ()=> {}"),()=>{});
特点
对象的状态不受外界影响 (3种状态) Pending 状态(初始状态) Fulfilled 状态(成功状态) Rejected 状态(失败状态)
一旦状态改变就不会再变,且不可逆 (两种状态改变:成功或失败) Pending -> Fulfilled Pending -> Rejected
promise 具有一个 then 方法,这个方法的功能是用来接受成功和失败的结 果
1. Promise 对象状态改为 Resolved 时调用 (必选)
2. Promise 对象状态改为 Rejected 时调用 (可选)
语法
promise.then(成功 , 失败)
eg:promise.then((res)=>{ console.log(res) },(err)=>{ console.log(err); })
可以优化一下then方法:
promise.then(成功).catch(失败)
eg: let p=new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('成功'); // reject('失败'); },100); })
p.then((res)=>{
console.log(res) //成功 })
.catch((err)=>{
console.log(err);
})
1.defer:defer JS异步下载,dom结构解析完(标签 + 样式(内容不一定下载完))才执行 (执行会阻塞dom渲染) 仅IE能用 内部JS也能用该属性 异步加载js不允许使用[removed],因为[removed]会清除文档流,js标签还未加载就会被清除 [removed]()可用于初始化页面2.(h5)async:async(asynchronous) ajax(asynchronous javascript and XML) JS异步加载,加载完毕后立刻执行(执行阻塞dom渲染) IE8及以下不兼容 内部JS不能用该属性
3.除了以上两种方法,还有一种兼容自己封装的异步加载方式,即动态添加script标签也能实现异步加载。
Js给初学者的印象总是那么的杂而乱,相信很多初学者都在找轻松学习Js的途径。在这里给大家总结一些学习Js的经验,希望能给后来的学习者探索出一条轻松学习Js之路。Js给人那种感觉的原因多半是因为它如下的特点:A:本身知识很抽象、晦涩难懂,如:闭包、内置...
看图:
基本类型( 6种 ):Number ( 数值 ) String ( 字符串 )Boolean ( 布尔 ) Undefined ( 未定义 )Null ( 空 )ES6 - Symbol ( 唯一 )
JavaScript 使网页增加互动性,使有规律地重复的HTML文段简化,减少下载时间。JavaScript 能及时响应用户的操作,对提交表单做即时的检查,无需浪费时间交由 CGI 验证。JavaScript 的特点是无穷无尽的,只要你有创意。...
timeoutId: 定时器IDfunc: 延迟后执行的函数code: 延迟后执行的代码字符串,不推荐使用原理类似eval()delay: 延迟的时间(单位:毫秒),默认值为0param1,param2: 向延迟函数传递而外的参数,IE9以上支持setInterval: 以固定的时间间隔重复调用一个函...
Number类型String类型Boolean类型Undefined类型Null类型
空格在ASCII中的值为32,空字符为0,可本人觉得不就是都是为空的吗,没有什么区别?char mychar1,mychar2;mychar1=' ';mychar2='\0';printf(mychar1=%d,mychar2=%d,mychar1,mychar2);//其中mychar1=32;mychar2=0;...
1.变量名可以有数字0~9、大小写字母、下划线、美元符$组成。2.变量名不能以数字开头。 当我们以数字为开头时,代码就会出现橙色下划线,代表命名不...3.变量名不允许使用中文。 不能允许使用中文这个就不用多说了吧,不管你在哪找代码来看,代码中...4.区分大小写...
向一个对象数组里面添加新的属性var arry= [{a:11,b:22,c:33,d:44},{a:11,b:0,c:0,d:44},{a:11,b:22,c:99,d:99}];var arry2=[];arry.map(((item, index)=> {arry2.push(Object.assign({},item,{mess1:item.c,mess2:item.d}))}))cons...
我觉得getTopWindow() 应该是他自己写的函数 mask 应该是getTopWindow()函数中 return 出的一个什么玩意show() jQuery的显示
看上图
如图所示
1、原型对象也是普通的对象,是对象一个自带隐式的 __proto__ 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为 null 的话,我们就称之为原型链 2、 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链...
如图所示,最简单的选项卡思路:选项卡就是点击按钮切换到相应内容,其实就是点击按钮把内容通过display(block none)来实现切换的。1、首先获取元素。2、for循环历遍按钮元素添加onclick 或者 onmousemove事件。3、因为点击当前按钮时会以高亮状态显示,所以...
1、js截取两个字符串之间的内容:123var str = aaabbbcccdddeeefff; str = str.match(/aaa(\S*)fff/)[1]; alert(str);//结果bbbcccdddeee2、js截取某个字符串前面的内容:123var str = aaabbbcccdddeeefff; tr = str.match(/(\S*)fff/)[1];......
如果是ajax 就直接获取如果是传到一个页面 就再get再在js中使用 就可以获取了。 可以在js中获取一个变量 但是不能写入一段java代码.
最多设置5个标签!
异步加载又叫非阻塞加载,浏览器在下载执行js的同时,还会继续进行后续页面的处理。主要有三种方式。
方法一:也叫Script DOM Element
方法二:onload时的异步加载
方法三:其他方法:由于JavaScript的动态性,还有很多异步加载方法: XHR Injection、 XHR Eval、 Script In Iframe、 Script defer属性、 [removed](script tag)。
利用回调函数
利用promise配合async和await
1.Generator函数 状态机 (生成器)
概念: Generator 的中文名称是生成器,它是 ECMAScript6 中提供的新特性。 Generator 函数是 ES6 提供的一种异步编程解决方案,在过去,封装一段 运算逻辑的单元是函数。函数只存在“没有被调用”或者“被调用”的情况,不存 在一个函数被执行之后还能暂停的情况,而 Generator 的出现让这种情况成 为可能,我们可以把 Generator 函数理解成状态机,封装了多个内部状态。
语法:
1. function 后面需要加 *
eg:
function* generator()
2. 函数内需要使用 yield 表达式来描述状态
调用:
我们调用了 generator 函数之后,会返回一个 iterator 对 象,随后需要调用 next 方法, 才会看到结果, next 方法遇到 yield 就 会暂停,需要再次调用。
yield关键字:
1. 真正让Generator具有价值的是yield关键字,这个yield关键字让 Generator内部的逻辑能够切割成多个部分。
2. yield 表达式后面的状态,会在 next 方法返回的对象中的 value 上出 现
3. yield 表达式本身是没有值的,如果想要让表达式有值的话,我们可以 向 next 方法传参,通过 .next() 传递参数,可以赋值给 yield 关键字前 面的变量声明。
4. next 方法传参时是针对上一个 yield 生效的
eg:
let compute = function* (a, b) {
var foo = yield a + b;
console.log(foo);
};
let generator = compute(4, 2);
generator.next(); // {value: 6, done: false}
generator.next("Hello world!"); //Hello world! {val ue: undefined, done: true}
拓展:同步异步问题 1. 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完 毕,才能执行后一个任务; 2. 异步任务指的是,不进入主线程、而进入”任务队列”的任务,只有等主 线程任务执行完毕,”任务队列”开始通知主线程,请求执行任务,该任 务才会进入主线程执行。
2.Promise
概念:
promise 也是 es6 提供的一种异步编程的解决方案,语法和使用场景要比 generator 优秀。
使用方式:
1. 是一个构造函数 , 所以要 new Promise() 2. 需要使用 then 方法来接受成功或失败的结果
eg:
var promise = new Promise((resolve, reject)=>{})
promise .then( ()=> {}"),()=>{});
特点
对象的状态不受外界影响 (3种状态) Pending 状态(初始状态) Fulfilled 状态(成功状态) Rejected 状态(失败状态)
一旦状态改变就不会再变,且不可逆 (两种状态改变:成功或失败) Pending -> Fulfilled Pending -> Rejected
promise 具有一个 then 方法,这个方法的功能是用来接受成功和失败的结 果
1. Promise 对象状态改为 Resolved 时调用 (必选)
2. Promise 对象状态改为 Rejected 时调用 (可选)
语法
promise.then(成功 , 失败)
eg:promise.then((res)=>{ console.log(res) },(err)=>{ console.log(err); })
可以优化一下then方法:
promise.then(成功).catch(失败)
eg: let p=new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('成功'); // reject('失败'); },100); })
p.then((res)=>{
console.log(res) //成功 })
.catch((err)=>{
console.log(err);
})
1.defer:defer
JS异步下载,dom结构解析完(标签 + 样式(内容不一定下载完))才执行 (执行会阻塞dom渲染)
仅IE能用
内部JS也能用该属性
异步加载js不允许使用[removed],因为[removed]会清除文档流,js标签还未加载就会被清除
[removed]()可用于初始化页面
2.(h5)async:async(asynchronous) ajax(asynchronous javascript and XML)
JS异步加载,加载完毕后立刻执行(执行阻塞dom渲染)
IE8及以下不兼容
内部JS不能用该属性
3.除了以上两种方法,还有一种兼容自己封装的异步加载方式,即动态添加script标签也能实现异步加载。
相关问题推荐
Js给初学者的印象总是那么的杂而乱,相信很多初学者都在找轻松学习Js的途径。在这里给大家总结一些学习Js的经验,希望能给后来的学习者探索出一条轻松学习Js之路。Js给人那种感觉的原因多半是因为它如下的特点:A:本身知识很抽象、晦涩难懂,如:闭包、内置...
看图:
基本类型( 6种 ):Number ( 数值 ) String ( 字符串 )Boolean ( 布尔 ) Undefined ( 未定义 )Null ( 空 )ES6 - Symbol ( 唯一 )
JavaScript 使网页增加互动性,使有规律地重复的HTML文段简化,减少下载时间。JavaScript 能及时响应用户的操作,对提交表单做即时的检查,无需浪费时间交由 CGI 验证。JavaScript 的特点是无穷无尽的,只要你有创意。...
timeoutId: 定时器IDfunc: 延迟后执行的函数code: 延迟后执行的代码字符串,不推荐使用原理类似eval()delay: 延迟的时间(单位:毫秒),默认值为0param1,param2: 向延迟函数传递而外的参数,IE9以上支持setInterval: 以固定的时间间隔重复调用一个函...
Number类型String类型Boolean类型Undefined类型Null类型
空格在ASCII中的值为32,空字符为0,可本人觉得不就是都是为空的吗,没有什么区别?char mychar1,mychar2;mychar1=' ';mychar2='\0';printf(mychar1=%d,mychar2=%d,mychar1,mychar2);//其中mychar1=32;mychar2=0;...
1.变量名可以有数字0~9、大小写字母、下划线、美元符$组成。2.变量名不能以数字开头。 当我们以数字为开头时,代码就会出现橙色下划线,代表命名不...3.变量名不允许使用中文。 不能允许使用中文这个就不用多说了吧,不管你在哪找代码来看,代码中...4.区分大小写...
向一个对象数组里面添加新的属性var arry= [{a:11,b:22,c:33,d:44},{a:11,b:0,c:0,d:44},{a:11,b:22,c:99,d:99}];var arry2=[];arry.map(((item, index)=> {arry2.push(Object.assign({},item,{mess1:item.c,mess2:item.d}))}))cons...
我觉得getTopWindow() 应该是他自己写的函数 mask 应该是getTopWindow()函数中 return 出的一个什么玩意show() jQuery的显示
看上图
如图所示
1、原型对象也是普通的对象,是对象一个自带隐式的 __proto__ 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为 null 的话,我们就称之为原型链 2、 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链...
如图所示,最简单的选项卡思路:选项卡就是点击按钮切换到相应内容,其实就是点击按钮把内容通过display(block none)来实现切换的。1、首先获取元素。2、for循环历遍按钮元素添加onclick 或者 onmousemove事件。3、因为点击当前按钮时会以高亮状态显示,所以...
1、js截取两个字符串之间的内容:123var str = aaabbbcccdddeeefff; str = str.match(/aaa(\S*)fff/)[1]; alert(str);//结果bbbcccdddeee2、js截取某个字符串前面的内容:123var str = aaabbbcccdddeeefff; tr = str.match(/(\S*)fff/)[1];......
如果是ajax 就直接获取如果是传到一个页面 就再get再在js中使用 就可以获取了。 可以在js中获取一个变量 但是不能写入一段java代码.