ajax、promise串行处理等

常见的数据交互方面的的前端轮子,持续整理ing~

一、手写ajax(要求考虑尽可能全面)

//对请求的data进行格式化处理
	function formataData(data){
		let arr=[];
		for(let key in data){
			arr.push(encodeURIComponent(key)+"="+encodeURIComponent(data[key]))
		}
		return arr.join("&");
	}
	function ajax(params){
		params=params||{};
		params.data=params.data||{};

		//普通GET请求,POST请求
		params.type=(params.type||"GET").toUpperCase();
		params.data=formataData(params.data);
		//如果是ie6浏览器,那么,XMLHttpRequest是不存在的,应该调用ActiveXObject;
		let xhr=XMLHttpRequest?new XMLHttpRequest() : new ActiveXObject(‘Microsoft.XMLHTTP‘);
		if(params.type==="GET"){
			xhr.open(params.type,params.url+‘?‘+params.data,true)
			xhr.send();
		}else{
			xhr.open(params.type,params.url,true);
			xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
			xhr.send(params.data);//send接收一个参数作为请求主体发送的数据,如果是get请求则不用传参,post请求的话,将数据传入
		}
		xhr.onreadystatechange=function(){
			if(xhr.readyState=4){
				//对返回数据进行正确或差错处理
				if (xhr.status === 200 || xhr.status === 304 || xhr.status === 206){
					var res;
					if(params.success&&params.success instanceof Function){
						res=JSON.parse(xhr.responseText);
						params.success.call(xhr,res);
					}
				}else{
					if(params.error&&params.error instanceof Function){
						res=xhr.responseText;
						params.error.cal(xhr,res);
					}
				}
			}
		}
	}

二、串行执行多个promise

1)Promise.all

      var newArr=[
		function foo(){
		return new Promise((resolve,reject)=>{
			console.log(1)
			setTimeout(()=>{
				console.log("execute");
				resolve();
			},1000)
		})
		},
		function foo1(){
		return new Promise((resolve,reject)=>{
			console.log(2)
			setTimeout(()=>{
				console.log("execute");
				resolve();
			},1000)
		})
		},
		function foo2(){
		return new Promise((resolve,reject)=>{
			console.log(3)
			setTimeout(()=>{
				console.log("execute");
				resolve();
			},1000)
		})
		}
	]

	Promise.all(newArr).then(()=>{
		console.log(‘success‘)
	},(err)=>{console.log(err)})

o_o ....好像不太对

2)、async await加for循环

(async function(){
  for (let i of arr){
	await foo(i)
  }
  console.log("success")
})()  

三、解析url参数为对象

要求键相同的组装成数组,无值的键默认设为true,值可以转换为数字的转换为数字

function parseParam(url){
		const paramsStr=/.+\?(.+)$/.exec(url)[1];//取出?后的字符串
		const paramsArr=paramsStr.split(‘&‘);//将字符串以&分割后存到数组中
		let paramsObj={};
		//将paramsObj存到对象中
		paramsArr.forEach(param=>{
			if(/=/.test(param)){
				let [key,val]=param.split("=");
				val=decodeURIComponent(val);
				val=/^\d+$/.test(val)?parseFloat(val):val;//判断是否转为数字
				if(paramsObj.hasOwnProperty(key)){
				//对象如果有key,则添加一个值
				paramsObj[key]=[].concat(paramsObj[key],val)
				}else{
				//如果对象没有这个key,创建key并设置值
				paramsObj[key]=val;
				}
			}else{
				//处理没有val的参数
				paramsObj[param]=true;
			}
		})
		return paramsObj;
}

原文地址:https://www.cnblogs.com/MelodysBlog/p/11614633.html

时间: 2024-11-13 08:17:41

ajax、promise串行处理等的相关文章

JQuery使用deferreds串行多个ajax请求

使用JQuery对多个ajax请求串行执行. HTML代码: <a href="#">Click me!</a> <div></div> JS: function GetSomeDeferredStuff() { var deferreds = []; var i = 1; for (i = 1; i <= 10; i++) { var count = i; deferreds.push( $.post('/echo/html/',

轻松无痛实现异步操作串行

提起异步操作的序列执行,指的是有一系列的异步操作(比如网络请求)的执行有前后的依赖关系,前一个请求执行完毕后,才能执行下一个请求. 异步操作的定义 我们定义一般异步操作都是如下形式: 1 2 3 4 5 func asyncOperation(complete : ()-> Void){ //..do something complete() } 常规的异步操作都会接受一个闭包作为参数,用于操作执行完毕后的回调. 那异步操作的序列化会有什么问题呢? 看如下的伪代码: 1 2 3 4 5 6 7

JSON串行化

大多数情况下,我们不会再Javascript中直接创建JSON字符串.而是,创建一些Javascript对象,这些对象和服务器上的.net对象对应.因此,可以在服务器上创建.net实体类,然后串行化成JSON格式,随后在浏览器中反串行化为Javascript对象. Album.asmx <%@ WebService Language="C#" Class="AlbumProxy" %> using System; using System.Web; us

控制异步回调利器 - async 串行series,并行parallel,智能控制auto简介

async 作为大名鼎鼎的异步控制流程包,在npmjs.org 排名稳居前五,目前已经逐渐形成node.js下控制异步流程的一个规范.async成为异步编码流程控制的老大哥绝非偶然,它不仅使用方便,文档完善,把你杂乱无章的代码结构化,生辰嵌套的回掉清晰化. async 提供的api包括三个部分: (1)流程控制 常见的几种流程控制. (2)集合处理 异步操作处理集合中的数据. (3)工具类 . github 开源地址: https://github.com/caolan/async 安装方法:

async/await实现图片的串行、并行加载

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?        

IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dispatch_queue_t,一种先进先出的数据结构,线程的创建和回收不需要程序员操作,由队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, dispatch_queue_serial); 并

串行工作模式之同步移位寄存器的输入输出方式

主要用于扩展并行输入或输出口.数据有RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出.发送和接受均为8位数据.低位在前,高位在后. //串行口工作模式0 #include <reg52.h> #define uchar unsigned char #define uint unsigned int void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void

Node.js 实现串行化流程控制

为了演示如何实现串行流程控制,我们准备做个小程序,让它从一个随机选择的RSS预定源中获取一片标题和URL,并显示出来. RSS预定源列表放在rss_feeds.txt文件中,内容如下: http://feed.cnblogs.com/blog/u/376823/rss http://lambda-the-ultimate.org/rss.xml 运行程序前我们需要安装两个模块:request模块是个经过简化的HTTP客户端,你可以用它获取RSS数据.htmlparser模块能把原始的RSS数据转