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),流程比较混乱,而且每个任务只能指定 ...
随机推荐
- pro_select_roleinfo_p3
DELIMITER | drop procedure if exists pro_select_roleinfo_p3; CREATE PROCEDURE pro_select_roleinfo_p3 ...
- submit按钮修改宽高的坑
近些天对h5非常感兴趣,边工作边学习,虽然比较累,但过得很踏实.每天都要学习一点东西,这样才能对得起自己.好了,废话不多说,进入今天的主题. 今天遇到了一个非常有趣的东西,就是在修改submit按钮的 ...
- smart git使用+单人开发一般流程
单人开发一般流程 clone checkout develop start gitflow start feature 写代码... 选中文件stage(相当于add) commit push fea ...
- 报错:Cannot remove entries from nonexistent file c:\program files\anaconda3\lib\site-packages\easy-install.pth
Outline 这两天通过“掘金量化终端”跑模型策略,之前装好环境一直ok,可以顺畅的Running~ 下午重装了下 Anaconda,刚才跑的时候提示 缺少“gm”模块 (掘金量化必须包): 就按照 ...
- [TensorFlow] tf.nn.softmax_cross_entropy_with_logits的用法
在计算loss的时候,最常见的一句话就是tf.nn.softmax_cross_entropy_with_logits,那么它到底是怎么做的呢? 首先明确一点,loss是代价值,也就是我们要最小化的值 ...
- delphi webbrowser 获取iframe
procedure TForm1.Button4Click(Sender: TObject);var Index: Integer; Document: IHTMLDocument2; FrameId ...
- EOJ - 3631 Delivery Service 2018.8华师大月赛(树链剖分+贪心)
链接:https://acm.ecnu.edu.cn/contest/103/problem/D/ 题意:给你一棵无向边连接的树,边的权值可以任意互换.有m次运输,每次的花费是点u到v路径上边的权值和 ...
- 笔记2:Jmeter核心组件
资料来源:开源优测 微信公众号,作者:苦叶子 Jmeter核心组件 1.Thread Group(线程组) 2.逻辑控制器,配置元件,定时器,前置处理器,Sample,后置处理器,断言,监听器: 3. ...
- 在HI3531上移植和运行QT4.8.6
在HI3531上移植和运行QT4.8.6 1. 前言: 近段有点时间,想把QT移植到HI3531上,在网上查找了很多资料,但都不是很全面,有些有问题也没有得到很好的体现. 2. ...
- 【笔记】c++文件
1.文件. #include <iostream> #include <cstdio> #include <string> #include <cstring ...