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

一 回调函数

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

f1();
f2();

如果f1是一个很耗时的任务,可以考虑改写f1,把f2写成f1的回调函数

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

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

f1(f2);//调用

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

具体例子:

由于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) //调用

二 发布/订阅 模式

我们假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做"发布/订阅模式"(publish-subscribe pattern),又称"观察者模式"(observer pattern)。

这个模式有多种实现,下面采用的是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

javascript异步编程的几种方法的更多相关文章

  1. [转载]Javascript异步编程的4种方法

    NodeJs的最大特性就是"异步" 目前在NodeJs里实现异步的方法中,使用“回调”是最常见的. 其实还有其他4种实现异步的方法: 在此以做记录 --- http://www.r ...

  2. (转)javascript异步编程的四种方法

    本文转自:http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html 作者:阮一峰 本文仅仅作为个人mark ...

  3. Javascript异步编程的4种方法

    你可能知道,Javascript语言的执行环境是"单线程"(single thread).   所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必 ...

  4. Javascript 异步编程的4种方法

    你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排 ...

  5. Javascript 异步编程的4种方法详解

    你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排 ...

  6. 转:Javascript异步编程的4种方法

    你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排 ...

  7. Javascript异步编程的4种方法(阮一峰)

    转载: http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html 你可能知道,Javascript语言的执 ...

  8. (转载)Javascript异步编程的4种方法

    你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排 ...

  9. JavaScript异步编程的四种方法

    1.回调函数 f1(f2); 回调函数是异步编程的基本方法.其优点是易编写.易理解和易部署:缺点是不利于代码的阅读和维护,各个部分之间高度耦合 (Coupling),流程比较混乱,而且每个任务只能指定 ...

随机推荐

  1. jquery练习题

    1.自定义登录校验 用户输入用户名和密码 输入的用户名和密码不能为空 如果用户输入的用户名或者密码为空,你就提示它用户名不能为空或者密码不能为空. 知识点:文本操作相关 <!DOCTYPE ht ...

  2. 并发测试 java.lang.OutOfMemoryError: GC overhead limit exceeded Xms Xmx 阻塞请求 单节点 请求分发 负载均衡

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:705) at javax.servlet.http.HttpServlet.se ...

  3. Taylor's theorem

    w https://en.wikipedia.org/wiki/Taylor_series

  4. 模块 - logging/re

    logging 模块 很多程序都有记录日志的需求 logging的日志可以分为 debug(), info(), warning(), error() and critical()5个级别 1.最简单 ...

  5. Java 集合框架工具类

    Collections Arrays Collections 集合框架的工具类, 里面的方法都是静态的, 可以直接使用类名调用 常用方法 1. sort(List<T> list); // ...

  6. shell脚本调用传参【转载】

    转自:https://www.cnblogs.com/cisum/p/8010658.html 1.直接使用$0,$1,$2,$3 $0是脚本的名字,就是按顺序来 #!/bin/bash # auth ...

  7. Matplot相关(二)——统计图

    Matplotlib:其能够支持所有的2D作图和部分3D作图.能通过交互环境做出印刷质量的图像. ————————缩写定义———————— import matplot.pyplot as plt — ...

  8. 大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)

    大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008) 分类: C#2013-08-10 18:47 1589人阅读 评论(5) 收藏 举报 NHibernat ...

  9. Oracle数据安全(五)审计

    一.审计的概念 审计是监视和记录用户对数据库所进行操作,以供DBA进行统计和分析.利用审计可以完成下列任务 保证用户能够对自己在数据库中的活动负责. 禁止用户在数据库中从事于自己职责不相符的活动 调查 ...

  10. $python数据分析基础——初识numpy库

    numpy库是python的一个著名的科学计算库,本文是一个quickstart. 引入:计算BMI BMI = 体重(kg)/身高(m)^2 假如有如下几组体重和身高数据,让求每组数据的BMI值: ...