promise用法详解
es6的promise可谓是异步书写的一大福音,过去异步js书写是函数嵌套函数的方式,promise出现后书写异步js代码就变得美观得多了
以前的写法:回调函数不停嵌套
ajax('/banners', function (banner_data){
ajax('/hotItems', function (hotitem_data){
ajax('/slides', function (slide_data){
ajax('/slides', function (slide_data){
}, function (){
alert('读取失败');
});
}, function (){
alert('读取失败');
});
}, function (){
alert('读取失败');
});
}, function (){
alert('读取失败');
});
Promise写法:
Promise.all([promise1,promise2..]).then(res=>{},err=>{})
这个方法是等数组所有异步请求都返回结果才执行then,都成功执行第一个回调函数,其中一个失败了就执行第二个回调函数
Promise.all([
promise1,
promise2
]).then(function (results){
let [data1, data2]=results;
alert('成功了');
console.log(arr, json);
}, function (err){
alert('失败了');
});
Promise.race([promise1,promise2..]).then(res=>{},err=>{})
这个方法跟之前的all用法一样,不同的是数组里面的任意一个异步请求先返回了结果就马上执行第一个回调函数,常用语请求不同服务器的同一样资源,以求达到最快响应速度。
ps: then里面的回调函数可以return Promise和一般值。
如果返回一般值,则链式的下个回调函数直接在下个微任务执行。
如果返回Promise, 则链式的下个回调函数会等到这个Promise resolve才会执行。
fetch
Fetch 是浏览器提供的原生 AJAX 接口。
由于原来的XMLHttpRequest不符合关注分离原则,且基于事件的模型在处理异步上已经没有现代的Promise等那么有优势。因此Fetch出现来解决这种问题。
Fetch API 提供了能够用于操作一部分 HTTP 的 JavaScript 接口,比如 requests 和 responses。它同时也提供了一个全局的 fetch() 方法——能够简单的异步的获取资源。
使用 window.fetch 函数可以代替以前的 $. ajax、$.get 和 $.post。可以说fetch把xml(原生ajax)和promise完美的融合在一起了~~
如果没有fetch,promise写法就会变得异常恶心:
let promise = new Promise((resolve,reject)=>{
let xhr = new XMLHttpRequset();
xhr.open('GET','url~~~',true);
xhr.send();
xhr.onreadystatechange =function(){
if(xhr.readyState==4&&xhr.status==200){
resolve(JSON.parse(xhr.responseText));
}else{
reject()
}
}
});
promise.then(function(){~~~},function(){~~~})
居然要在promise里面写事件绑定,这种写法是显然与promise的写法格格不入,所以fetch出现了
下面介绍下fetch的写法:
- get
fetch('/test/content.json').then(function(data){
return data.json(); //这里返回的是promise
}).then(function(data){
console.log(data);
}).catch(function(error){
console.log(error);
});
- post
fetch('/test/content.json', { // url: fetch事实标准中可以通过Request相关api进行设置
method: 'POST',
mode: 'same-origin', // same-origin|no-cors(默认)|cors
credentials: 'include', // omit(默认,不带cookie)|same-origin(同源带cookie)|include(总是带cookie)
headers: { // headers: fetch事实标准中可以通过Header相关api进行设置
'Content-Type': 'application/x-www-form-urlencoded' // default: 'application/json'
},
body: 'a=1&b=2' // body: fetch事实标准中可以通过Body相关api进行设置
}).then(function(res){ //res: fetch事实标准中可以通过Response相关api进行设置
return res.json(); //这里返回的是promise
}).then(function(data){
console.log(data);
}).catch(function(error){ });
promise用法详解的更多相关文章
- es6的promise用法详解
es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...
- Es6 Promise 用法详解
Promise是什么?? 打印出来看看 console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...
- ES6之Promise用法详解
一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...
- ES6 Promise用法详解
What is Promise? Promise是一个构造函数,接受一个参数(Function),并且该参数接受两个参数resolve和reject(分别表示异步操作执行成功后的回调函数.执行失败后的 ...
- JS - Promise使用详解--摘抄笔记
第一部分: JS - Promise使用详解1(基本概念.使用优点) 一.promises相关概念 promises 的概念是由 CommonJS 小组的成员在 Promises/A 规范中提出来的. ...
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- @RequestMapping 用法详解之地址映射
@RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...
- linux管道命令grep命令参数及用法详解---附使用案例|grep
功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
随机推荐
- b总结
Beta 答辩总结 评审表 组名 格式 内容 ppt 演讲 答辩 总计 天机组 15 15 13 15 14 72 PMS 16 16 15 16 16 79 日不落战队 16 17 17 17 17 ...
- iOS 模拟器“安装”app
1.首先在模拟器上运行我们的app程序 2.执行以下命令: ditto -ck --sequesterRsrc --keepParent `ls - -d -t ~/Library/Developer ...
- docker网络调试过程
#1: 添加永久网桥 vi /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 TYPE=Bridge BOOTROTO=static IPADDR ...
- FreeMarker boolean Issue
FreeMarker template error:Can't convert boolean to string automatically, because the "boolean_f ...
- OA与BPM的区别
BPM OA 软件架构 JAVA..NET.基于SOA架构 JAVA..NET.PHP.Domino 驱动模式 流程驱动 文档驱动 交互 人与人,人与系统,系统与系统 人与人 软件功能 ...
- 常见的HTTP报头(头参数)
本内容摘抄自<RESTful WebServices> 中文译本附录C '常见的HTTP报头'. 原文作者:Leonard Ricbardson & Sam Ruby 翻译:徐涵. ...
- python之random函数
# random各种使用方法 import random # 随机生成[0.1)的浮点数 print("random():", random.random()) # 随机生成100 ...
- codeforces1045B
CF1045B 自己瞎鸡巴yy了一下,可知若一个数X不能被表示出来,那么X所有的表示方法都在A集合中,如a1,a2,a3······an-1,an-2中若a1+ai不能被表示出来,那么如果a1到ai是 ...
- maven-assembly-plugin把java工程打包成为一个可执行的jar包
用Java写了一个小工具,使用maven java 工程.写完后,想打包成一个可执行的jar包. 使用maven的插件maven-assembly-plugin pom.xml里添加 <buil ...
- NOIP 2018 游记(退役了!)
一片空白 在霉的不能再霉的18年11月,Noip2018上,倒霉的我也是贼有意思,感冒加身,D2发烧,数组开小…我还能说什么MMP,身体和考试能力真的很重要. ……(省略无数字的心理活动,有空补上~) ...