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

一 回调函数

这是异步编程最基本的方法,假设有两个函数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. iOS JS与原生交互(全集)

    混合开发的重要性不言而喻,一个移动端开发的了解前端开发是一个趋向,总之每个人都向往成为一个全栈工程师,废话不多说,直接上主题 一.交互(UIWebView) 1.OC调用JS (1)OC调用代码 [s ...

  2. git 学习(一)初始化和提交

    git 学习(一) 创建git版本库 $ mkdir gitstudy $ cd gitstudy $ git init nitialized empty Git repository in /Use ...

  3. explorer.exe中发生未处理的win32异常

    explorer.exe中发生未处理的win32异常的错误提示,是windows系统比较常见的错误事件,多数在开机遇到,也有在电脑使用过程中遇到. 了解explorer.exe进程 从百度百科了解到, ...

  4. git学习------>写给 Git 初学者的7个建议

    PS:本文转载于(http://blog.jobbole.com/50603/),本文由 伯乐在线 - 吴鹏煜 翻译. 英文出处:(http://sixrevisions.com/web-develo ...

  5. 关于java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log

    配置JFinal环境时,jar包已导入,web.xml已配置,Config也已经配置好,测试服务器时不停地出现 Exception in thread "main" java.la ...

  6. jmeter 非GUI模式下测试报错An error occurred: Unknown arg:

    D:\download\性能工具\JMeter\apache-jmeter-2.11\apache-jmeter-2.11\bin>jmeter -n -t E:\性能测试\jmeter scr ...

  7. xshell下载安装

    打开网址http://www.netsarang.com/download/software.html 找到最新版的xshell,点击下载 在跳转的页面填写个人信息,许可证类型选择家庭和学校使用,除了 ...

  8. js刷新页面 location.reload()

    在javascript编程中,多使用location.reload实现页面刷新. 例子: 代码示例: window.location.href=window.location.href; window ...

  9. 禁止电脑登陆QQ聊天系统的四种方法

    一.使用防火墙禁止端口法 QQ使用的默认端口是 UDP 4000,使用防火墙将该端口关闭,那么别人就不能使用QQ了,当自己需要上网时只需开放该端口就可以了. 下面以我使用的“金山网镖6”进行说明,点击 ...

  10. app自动化测试-appium

    一.环境准备(windows) 1.安装Microsoft .NET Framework 4.5 双击运行如下文件:net4.5.1.exe 2.安装node-v6.11.4-x64.msi 双击运行 ...