美文网首页
JavaScript异步编程方式

JavaScript异步编程方式

作者: 傑仔 | 来源:发表于2019-05-28 17:14 被阅读0次

众所周知 JavaScript 是 单线程工作,也就是只有一个脚本执行完成后才能执行下一个脚本,两个脚本不能同时执行,如果某个脚本耗时很长,后面的脚本都必须排队等着,会拖延整个程序的执行。那么如何让程序像人类一样可以多线程工作呢?可参考Evevt Loop,以异步编程的方式,可以避免同步等待,提高效率。以下为几种异步编程方式的总结,希望与君共勉。

异步编程方式

  • 回调函数
  • 事件监听
  • 发布订阅模式
  • Promise
  • Generator
  • async

异步编程传统的解决方案:回调函数和事件监听
初始示例:假设有两个函数, f1 和 f2,f1 是一个需要一定时间的函数。

function f1(){
    setTimeout(function(){
        console.log('先执行 f1')    
    },1000)
}

function f2() {
    console.log('再执行 f2')
}

回调函数:

因为 f1 是一个需要一定时间的函数,所以可以将 f2 写成 f1 的 回调函数,将同步操作变成异步操作,f1 不会阻塞程序的运行,f2 也无需空空等待,例如 JQuery 的 ajax。

回调函数demo

function f1(f2){
    setTimeout(function(){
        console.log('先执行 f1')    
    },1000)
    f2()
}
function f2(){
    console.log('再执行 f2')
}
f1(f2)

执行结果如下图:

18D76D5E-58C2-482A-9FF8-B4F060FA0486.png
总结:回调函数易于实现、便于理解,但是多次回调会导致代码高度耦合

事件监听

脚本的执行不取决代码的顺序,而取决于某一个事件是否发生
事件监听的demo

$(document).ready(function(){
     console.log('DOM 已经 ready')
});

发布订阅模式

发布/订阅模式是利用一个消息中心,发布者发布一个消息给消息中心,订阅者从消息中心订阅该消息。类似于 vue 的父子组件之间的传值。
发布订阅模式的 demo

//订阅done事件

$('#app').on('done',function(data){
    console.log(data)
})
//发布事件
$('#app').trigger('done,'haha')

Promise

Promise 实际就是一个对象, 从它可以获得异步操作的消息,Promise 对象有三种状态,pending(进行中)、fulfilled(已成功)和rejected(已失败)。Promise 的状态一旦改变之后,就不会在发生任何变化,将回调函数变成了链式调用。
Promise 封装异步请求demo

export default function  getMethods(url){    
  return new Promise(function (resolve, reject){
        axios.get(url).then(res=> {
            resolve(res)   
        }).catch(err=>{
            reject(err)   
        })
   })
}

getMethods('/api/xxx').then(res => {
    console.log(res)
}, err =>{
    console.log(err)
})

async

async函数返回的是一个 Promise 对象,可以使用 then 方法添加回调函数,async 函数内部 return 语句返回的值,会成为 then 方法回调函数的参数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

1.await命令后面返回的是 Promise 对象,运行结果可能是rejected,所以最好把await命令放在try...catch代码块中。
async 的 demo

async function demo(){
  try{
    await 
new Promise(function(resolve, reject){      
    // something
  });
}catch(err){
    console.log(err);  
}}

demo().then(data=>{
    console.log(data)  
  // something
})

参考:
1、https://mp.weixin.qq.com/s/dP4eOL4IvN2CRdq3plB3Rw

相关文章

  • JavaScript异步编程好文摘要

    JavaScript之异步编程简述JavaScript异步编程

  • part1整理

    函数式编程:JavaScript函数式编程指南 异步编程:异步编程 Promise源码 JavaScript基础知...

  • 2.0.1 Ajax

    AJAX (Asynchronous JavaScript And XML) 异步的Web编程方式 ajax开发步...

  • JavaScript异步编程方式

    众所周知 JavaScript 是 单线程工作,也就是只有一个脚本执行完成后才能执行下一个脚本,两个脚本不能同时执...

  • 含答案的面试题总结

    1. 说说JavaScript中有哪些异步编程方式? 1. 回调函数 回调函数是异步编程的基本方法。其优点是易编写...

  • 一篇看完JS异步编程的进阶史

    一、Javascript实现异步编程的过程以及原理 1、为什么要用Javascript异步编程 众所周知,Java...

  • ES6 之 Promise

    Promise是JavaScript异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步...

  • JavaScript(ES6) - Async

    异步编程对JavaScript语言太重要。Javascript语言的执行环境是“单线程”的,如果没有异步编程,根本...

  • 异步编程控制方法

    javascript 具有的一个特性就是异步编程。异步编程具有的优势本文不做细说,本文主要是总结如何异步编程中出现...

  • Javascript------异步编程的4种方法

    Javascript异步编程的4种方法

网友评论

      本文标题:JavaScript异步编程方式

      本文链接:https://www.haomeiwen.com/subject/blgozqtx.html