javascript异步编程的几种方法
目前工作中用的比较多的异步模式编程有如下几种方法
一 回调函数
这是异步编程最基本的方法,假设有两个函数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异步编程的几种方法的更多相关文章
- [转载]Javascript异步编程的4种方法
NodeJs的最大特性就是"异步" 目前在NodeJs里实现异步的方法中,使用“回调”是最常见的. 其实还有其他4种实现异步的方法: 在此以做记录 --- http://www.r ...
- (转)javascript异步编程的四种方法
本文转自:http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html 作者:阮一峰 本文仅仅作为个人mark ...
- Javascript异步编程的4种方法
你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必 ...
- Javascript 异步编程的4种方法
你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排 ...
- Javascript 异步编程的4种方法详解
你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排 ...
- 转:Javascript异步编程的4种方法
你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排 ...
- Javascript异步编程的4种方法(阮一峰)
转载: http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html 你可能知道,Javascript语言的执 ...
- (转载)Javascript异步编程的4种方法
你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排 ...
- JavaScript异步编程的四种方法
1.回调函数 f1(f2); 回调函数是异步编程的基本方法.其优点是易编写.易理解和易部署:缺点是不利于代码的阅读和维护,各个部分之间高度耦合 (Coupling),流程比较混乱,而且每个任务只能指定 ...
随机推荐
- iOS JS与原生交互(全集)
混合开发的重要性不言而喻,一个移动端开发的了解前端开发是一个趋向,总之每个人都向往成为一个全栈工程师,废话不多说,直接上主题 一.交互(UIWebView) 1.OC调用JS (1)OC调用代码 [s ...
- git 学习(一)初始化和提交
git 学习(一) 创建git版本库 $ mkdir gitstudy $ cd gitstudy $ git init nitialized empty Git repository in /Use ...
- explorer.exe中发生未处理的win32异常
explorer.exe中发生未处理的win32异常的错误提示,是windows系统比较常见的错误事件,多数在开机遇到,也有在电脑使用过程中遇到. 了解explorer.exe进程 从百度百科了解到, ...
- git学习------>写给 Git 初学者的7个建议
PS:本文转载于(http://blog.jobbole.com/50603/),本文由 伯乐在线 - 吴鹏煜 翻译. 英文出处:(http://sixrevisions.com/web-develo ...
- 关于java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log
配置JFinal环境时,jar包已导入,web.xml已配置,Config也已经配置好,测试服务器时不停地出现 Exception in thread "main" java.la ...
- 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 ...
- xshell下载安装
打开网址http://www.netsarang.com/download/software.html 找到最新版的xshell,点击下载 在跳转的页面填写个人信息,许可证类型选择家庭和学校使用,除了 ...
- js刷新页面 location.reload()
在javascript编程中,多使用location.reload实现页面刷新. 例子: 代码示例: window.location.href=window.location.href; window ...
- 禁止电脑登陆QQ聊天系统的四种方法
一.使用防火墙禁止端口法 QQ使用的默认端口是 UDP 4000,使用防火墙将该端口关闭,那么别人就不能使用QQ了,当自己需要上网时只需开放该端口就可以了. 下面以我使用的“金山网镖6”进行说明,点击 ...
- app自动化测试-appium
一.环境准备(windows) 1.安装Microsoft .NET Framework 4.5 双击运行如下文件:net4.5.1.exe 2.安装node-v6.11.4-x64.msi 双击运行 ...