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用法详解的更多相关文章

  1. es6的promise用法详解

    es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...

  2. Es6 Promise 用法详解

     Promise是什么??    打印出来看看  console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...

  3. ES6之Promise用法详解

    一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...

  4. ES6 Promise用法详解

    What is Promise? Promise是一个构造函数,接受一个参数(Function),并且该参数接受两个参数resolve和reject(分别表示异步操作执行成功后的回调函数.执行失败后的 ...

  5. JS - Promise使用详解--摘抄笔记

    第一部分: JS - Promise使用详解1(基本概念.使用优点) 一.promises相关概念 promises 的概念是由 CommonJS 小组的成员在 Promises/A 规范中提出来的. ...

  6. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  7. @RequestMapping 用法详解之地址映射

    @RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...

  8. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  9. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

随机推荐

  1. 《Linux内核分析》第八周:进程的切换和系统的一般执行过程

    杨舒雯(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用gdb ...

  2. navicat有数据额结构同步

    这个功能可能检查两个库的表结构异同,进行表结构构同步,可以生成同步语句. 比如在测试环境表中新增了字段,可以通过这个工具进行表结构同步.

  3. 递归拼装Tree结构数据

    @Override public List<Map<String, Object>> queryListTree() { List<Map<String,Objec ...

  4. tensorflow在windows下的安装

    1.python 的安装 这里我选择的是Anaconda4.2,附上下载链接https://www.continuum.io/downloads 2.测试python安装是否成功 在cmd中输入pyt ...

  5. css3 @media 实现响应式布局

    使用css3的@media,可以实现针对不同媒体.不同分辨率的响应式布局. 方法1:根据不同分辨率使用不同css文件 <link rel="stylesheet" media ...

  6. js原生常用事件event

    onblur 元素失去焦点: onchange用户改变域的内容: onclick鼠标点击对象: onerror当加载图片时发生错误: onfocus 元素获得焦点: onkeypress某个键盘的键被 ...

  7. php中获取数据 php://input、$_POST与$GLOBALS['HTTP_RAW_POST_DATA']三者的区别

    $_POST 只有Coentent-Type的值为application/x-www.form-urlencoded和multipart/form-data两种类型时,$_POST才能获取到数据. $ ...

  8. python学习笔记三——控制语句

    2.5 运算符与表达式 2.5.1 算术运算符和算术表达式 算术运算符包括四则运算符.求模运算符和求幂运算符. 算术运算符 加减乘除:+ - * / 表达式:x+y   x-y   x*y  x/y ...

  9. Delphi.XE2破解方法

    我安装的是Delphi.XE2.RTM.v16.0.4256.43595.Lite.v5.0 ,安装完后打开显示是15天试用. 退出XE2后把C:\Program Files\Embarcadero\ ...

  10. 【Mysql】—— 索引的分类

    注意:索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引.MyISAM和InnoDB存储引擎:只支持BTREE索引,也就是说默认使用BTREE,不能够更换.MEMORY/HEAP存储引 ...