浅谈异步编程

浅谈异步编程

引子

页面渲染与setTimeout();

同步与异步------个人理解

任务在当次事件循环中阻塞后续任务进行的(指的是耗时较多,这个多少,暂时尚未个概念,反正就是在获取的cpu时间片中不作实际事情的就是阻塞吧),就是同步;任务在当次事件循环中不阻塞后续任务进行的(简单的能够理解为,一条流水线上,某个步骤要检测是否合格,不影响流水线的状况下,由流水线以外的工做人员,至关于worker,去作这件事情),就是异步;

异步编程重要js设计模式-------发布订阅者模式

  • 现实中的异步----------买车

小明要买车,小红告诉他如今车还没到,到的时候再打电话给他,因而小明留下了联系方式(订阅)。等到一段时间后,车到了,小红打电话给小明车到了(发布),小明在接到电话以后,要作一些准备(订阅时定义的回调函数)。
  • 工做中的异步

经过事件实例去作调控,简单的代码示例:
// emitter是一个事件实例,负责发布订阅者的内部实现

// 订阅
emitter.on('eventName', function () {
    dosomeThing();
});

// 发布
// 另外一端程序干一些事情。好了~时机到了,就:
emitter.emit('eventName');
发布订阅者模式其实在代码执行顺序上就是:订阅(监听)------> 发布(触发)
  • 传统异步编程

经过高阶函数实现
// 定义高阶函数
var asyncFn = function (cb) {
    // dosomeThing async...
    typeof === 'function' && cb();
};
// 使用
asyncFn(function (res) {
    // dosomeThing callback...
});
  • 如今比较经常使用的Promise

var asyncFn = function () {
    // dosomeThing sync...
    Promise.resolve(); // 一般用于当次事件循环(或者当前线程执行)结束以后才须要干的事情
}
// 码段1
let asyncFn = new Promise((resolve, reject) => {
    resolve('完成');
});

asyncFn.then((res) => {
    console.log(res);
});
console.log('同步');
码段1 执行结果:
VM51728:1 同步执行
22:26:27.891 VM51728:1 完成
22:26:27.891 undefined

产生异步的状况

  • setTimout()
  • setInterval()
  • requestAnimationFrame()
  • Promise.resolve()方法
  • 各类ajax异步请求
  • Vue的nextTick()方法,由三种方式实现
  • jsonp加载方式
  • ...
相关文章
相关标签/搜索