漫谈javascript同步&异步编程的N种方式 - ps:将html2canvas变成同步的解决方案

本文探讨javascript同步和异步编程的各种方法,并详细介绍了如何将html2canvas的异步加载转换为同步,主要涉及img.onload处理、proxyGetImage方法的改造,通过调整代码确保在处理跨域图片时实现同步。
摘要由CSDN通过智能技术生成
声明
本文不涉及如何优雅的设计和实现异步编程,只是从最基础的方面阐述异步、同步编程的方式。
如想优化实现,请移步:
(似乎不应该放在这里,可能你们看到这里就直接跳走了-_#,所以, 亲,别走,留下来~~
 
开篇
先看个例子:
console.log('1');
setTimeout(function(){
    console.log('first time');
}, 10);

console.log('2');

var flag = true;
setTimeout(function(){
    flag = false;
    console.log('second time');
}, 0);

var t_start = Number(new Date());
//延迟一秒才执行
while ( t_start + 1000 > Number(new Date()) ) {
    console.log(flag);
}
console.log('last ' + flag);

输出:

(忽略红色错误)从上面的输出可以看出,setTimeout的执行都被 挂起来了,等函数的其它部分都执行完毕后,才会开始执行;
所以,即使setTimeout在0ms后立即执行,最后也是在while循环等待了1s之后,才真正执行,即while是会阻塞setTimeout的;
还有,second time在first time之前输出,因为first time等待了10ms,如果将这个10ms改为0,那么这两个输出就会调换位置。
 
而造成上面这一切的根本原因就是:js的运行是 单线程的,当一个程序占着cpu狂奔的时候,其它人无法打断,只有等待。
 
接下来,说明下同步和异步:
由于单线程,按理说js的执行应该是从上至下顺序的,同步执行就是js原本的样子。
说到异步,可能创始人Brendan Eich也没有想过会有这种实现,随着web页面的丰富和发展,展现越来越慢,后人慢慢的创新了异步这种方式,如图:
 技术上的解释就是: 异步就是延时,延时就是在等待(by司徒)
最终目的就是:当一个耗时的任务需要执行时,应该将它异步分发出去,以便及时响应用户的请求。
 
那么将同步的函数转为异步的方式有哪些呢?下面就来一一说明:
1、setTimeout和setInterval
话不多说,请看开篇的例子。
setInterval跟setTimeout一样,运行时,被挂起,后续的函数不会等待interval中的事件执行完毕才开始,而是立马开始。
当然,这两个生成的异步都可以控制时间,可以自主控制多少秒后才会fire。
 
2、image.onload和image.onerror
代码:
var<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值