es6的promise可谓是异步书写的一大福音,过去异步js书写是函数嵌套函数的方式,promise出现后书写异步js代码就变得美观得多了

以前的写法:回调函数不停嵌套

  1. ajax('/banners', function (banner_data){
  2. ajax('/hotItems', function (hotitem_data){
  3. ajax('/slides', function (slide_data){
  4. ajax('/slides', function (slide_data){
  5.  
  6. }, function (){
  7. alert('读取失败');
  8. });
  9. }, function (){
  10. alert('读取失败');
  11. });
  12. }, function (){
  13. alert('读取失败');
  14. });
  15. }, function (){
  16. alert('读取失败');
  17. });

Promise写法:

Promise.all([promise1,promise2..]).then(res=>{},err=>{})

这个方法是等数组所有异步请求都返回结果才执行then,都成功执行第一个回调函数,其中一个失败了就执行第二个回调函数

  1. Promise.all([
  2. promise1,
  3. promise2
  4. ]).then(function (results){
  5. let [data1, data2]=results;
  6. alert('成功了');
  7. console.log(arr, json);
  8. }, function (err){
  9. alert('失败了');
  10. });

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写法就会变得异常恶心:

  1. let promise = new Promise((resolve,reject)=>{
  2. let xhr = new XMLHttpRequset();
  3. xhr.open('GET','url~~~',true);
  4. xhr.send();
  5. xhr.onreadystatechange =function(){
  6. if(xhr.readyState==4&&xhr.status==200){
  7. resolve(JSON.parse(xhr.responseText));
  8. }else{
  9. reject()
  10. }
  11. }
  12. });
  13. promise.then(function(){~~~},function(){~~~})

居然要在promise里面写事件绑定,这种写法是显然与promise的写法格格不入,所以fetch出现了


下面介绍下fetch的写法:

  • get
  1. fetch('/test/content.json').then(function(data){
  2. return data.json(); //这里返回的是promise
  3. }).then(function(data){
  4. console.log(data);
  5. }).catch(function(error){
  6. console.log(error);
  7. });
  • post
  1. fetch('/test/content.json', { // url: fetch事实标准中可以通过Request相关api进行设置
  2. method: 'POST',
  3. mode: 'same-origin', // same-origin|no-cors(默认)|cors
  4. credentials: 'include', // omit(默认,不带cookie)|same-origin(同源带cookie)|include(总是带cookie)
  5. headers: { // headers: fetch事实标准中可以通过Header相关api进行设置
  6. 'Content-Type': 'application/x-www-form-urlencoded' // default: 'application/json'
  7. },
  8. body: 'a=1&b=2' // body: fetch事实标准中可以通过Body相关api进行设置
  9. }).then(function(res){ //res: fetch事实标准中可以通过Response相关api进行设置
  10. return res.json(); //这里返回的是promise
  11. }).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. python 中一些常用的内置函数

    一.常用内置函数 abs(x) 返回绝对值,参数为int float,非字符只能num all(iterable) 如果迭代对象里面的所有值都为真就返回True.all([1, 2, -7]) --- ...

  2. 初识nginx——内存池篇

    初识nginx——内存池篇 为了自身使用的方便,Nginx封装了很多有用的数据结构,比如ngx_str_t ,ngx_array_t, ngx_pool_t 等等,对于内存池,nginx设计的十分精炼 ...

  3. JavaScript(ECMAScript) with 语句

    有同事,爱尝鲜,JavaScript ECMAScript with 语句,找了半天不知道局部变量的出处,原来是with语句搞得鬼. http://www.w3school.com.cn/js/pro ...

  4. vuex的数据交互

    methods:{ ...mapMutations({aaa:hs}) //将mutations的方法暴露出来,进行调用 aaa是他的名字 ...mapActions(['hs']) //将actio ...

  5. node的经典事件监听

    let fs = require('fs'); let Event = require('events'); let myEvent = new Event(); //注册一个订阅者 A myEven ...

  6. php 中instanceof的使用

    转载:https://www.cnblogs.com/tengjian/p/7999107.html 作用:(1)判断一个对象是否是某个类的实例,(2)判断一个对象是否实现了某个接口. 第一种用法: ...

  7. YII2十三大特性2

    第十三 场景(scenario)的使用 例如:有三个场景,分别为创建,更新,确认回款 首先,定义所有的场景,及规则,如下所示: <?php namespace core\models; use ...

  8. jmeter 创建web测试计划

    测试用例: 1 创建5个用户发送请求到2个web页面: 2 发送3次请求 总请求=5*2*3=30 创建这个测试计划需要用到以下元素:thread groups / http request / ht ...

  9. js實現

    js的代碼寫在<script></script>中: <script></script>可以放在body中或者head中,如果放在body中,一般放在b ...

  10. BZOJ3998 TJOI2015弦论(后缀数组+二分答案)

    先看t=1的情况.显然得求出SA(因为我不会SAM).我们一位位地确定答案.设填到了第len位,二分这一位填什么之后,在已经确定的答案所在的范围(SA上的某段区间)内二分,找到最后一个小于当前串的后缀 ...