javascript异步编程的几种方法

目前工做中用的比较多的异步模式编程有以下几种方法javascript

一 回调函数html

这是异步编程最基本的方法,假设有两个函数f1和f2,后者等待前者的执行结果java

f1();
f2();

若是f1是一个很耗时的任务,能够考虑改写f1,把f2写成f1的回调函数jquery

function f1(callback){
   setTimeout(function(){
       // f1的任务代码
      
       //执行回调函数
      callback()
    },1000)
}

执行代码就变成下面这样:git

f1(f2);//调用

采用这种方式,咱们把同步操做变成了异步操做,f1不会堵塞程序运行,至关于先执行程序的主要逻辑,将耗时的操做推迟执行github

 

具体例子:ajax

因为ajax请求是异步的,有时候咱们须要获得ajax请求后的数据,再进行其余的操做,这个时候回调函数会帮咱们解决这个问题,具体代码以下:编程

import $ from 'jquery'
function getData(callback){
  var url="http://xxx.com/activity/v1/homepage/index";
  var data={
      "cityId":110100,
      "type":"coupon"
  }
  $.ajax({
       url:url,
       type:'get',
       dataType:'jsonp',
       jsonp:'callback',
       data:data,
       success:function(resp){
        if(resp.status==200 && resp.data){
            var item = resp.data[0] && resp.data[0].coupon;
            if(callback){
                callback(item) //执行回调函数
            }
        }
       },
       error:function(err){
            console.log("error")
       }
  })
}

function getItem(data){
    if(data){
        //获得数据进行处理
        var url = data.moreUrl;
        alert(url)
    }
}

 getData(getItem) //调用

 

二 发布/订阅 模式json

咱们假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其余任务能够向信号中心"订阅"(subscribe)这个信号,从而知道何时本身能够开始执行。这就叫作"发布/订阅模式"(publish-subscribe pattern),又称"观察者模式"(observer pattern)。app

这个模式有多种实现,下面采用的是Ben Alman的Tiny Pub/Sub,这是jQuery的一个插件。

function PubSub(){
  this.handlers = {};
}

PubSub.prototype = {
  on:function(eventType,handler){
    var self = this;
    if(!(eventType in self.handlers)){
        self.handlers[eventType] = [];
    }
     self.handlers[eventType].push(handler);
      return this;
  },
  trigger:function(eventType){
    var self = this;
    var handlerArgs = Array.prototype.slice.call(arguments,1);
    for(var i=0;i<self.handlers[eventType].length;i++){
      self.handlers[eventType][i].apply(self,handlerArgs)
    }
    return self;
  }
}

具体调用:

var pubsub=new PubSub();

function getData(){
  var url="http://xxx.com/activity/v1/homepage/index";
  var data={
      "cityId":110100,
      "type":"coupon"
  }
  $.ajax({
       url:url,
       type:'get',
       dataType:'jsonp',
       jsonp:'callback',
       data:data,
       success:function(resp){
        if(resp.status==200 && resp.data){
            var item = resp.data[0] && resp.data[0].coupon;
            pubsub.trigger('done',item) //发布事件
        }
       },
       error:function(err){
            console.log("error")
       }
  })
}

//订阅事件
pubsub.on('done',function(data){
  getItem(data)
})

function getItem(data){
  alert('start')
  console.log('data='+data)
    if(data){
        //获得数据进行处理
        var url = data.moreUrl;
        alert(url)
    }
}

 getData() //调用

三 Promise对象

Promise 对象是CommonJS工做组提出的一种规范,目的是为异步编程提供统一接口

结合es7提供的async和await使用,代码以下:

import $ from 'jquery'
function getData(){
  return new Promise((resolve,reject) => {
     var url="http://xxx.com/activity/v1/homepage/index";
     var data={
        "cityId":110100,
        "type":"coupon"
      }
      $.ajax({
         url:url,
         type:'get',
         dataType:'jsonp',
         jsonp:'callback',
         data:data,
         success:function(resp){
            if(resp.status==200 && resp.data){
              var item = resp.data[0] && resp.data[0].coupon;
               resolve(item)
            }
         },
         error:function(err){
           reject("error")
         }
      })
  })
}

function getItem(data){
    if(data){
        //获得数据进行处理
        var url = data.moreUrl;
        alert(url)
    }
}

const testAsync = async () => {
  var data = await getData();
  getItem(data); 
}

//调用
testAsync();

 

参考连接:http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html

相关文章
相关标签/搜索