利用Promise自定义一个GET请求的函数示例代码


Posted in Javascript onMarch 20, 2019

写在最前面

近期 review 自己以前的代码的时候,看到 promise 的使用方法,用的比较模糊。含义不清,用法凌乱,这里重新温习一下基础知识。

前言

JavaScript 是单线程工作,但是浏览器是多线程的。为了更好的完成我们程序的任务。Promise 异步的操作就由此诞生了。

一个 Promise 就是一个代表了异步操作最终完成或者失败的结果对象。

怎么使用?

语法

基本

new Promise( function(resolve, reject) {...} /* executor */ );

Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。 在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。

then 的使用

promise.then(function(result) {
 console.log(result); // "Stuff worked!"
}, function(err) {
 console.log(err); // Error:"It broke"
});

then() 包含两个参数:一个用于成功情形的回调和一个用于失败情形的回调。 这两个皆可选,因此您可以只添加一个用于成功情形或失败情形的回调。

主要的 promise 的三个方法

Promise.all

        - 这个方法返回一个新的promise对象,该promise对象在iterable参数对象里所有的promise对象都成功的时候才会触发成功,一旦有任何一个iterable里面的promise对象失败则立即触发该promise对象的失败。这个新的promise对象在触发成功状态以后,会把一个包含iterable里所有promise返回值的数组作为成功回调的返回值,顺序跟iterable的顺序保持一致;如果这个新的promise对象触发了失败状态,它会把iterable里第一个触发失败的promise对象的错误信息作为它的失败错误信息。Promise.all方法常被用于处理多个promise对象的状态集合。 

Promise.reject

        - 返回一个状态为失败的Promise对象,并将给定的失败信息传递给对应的处理方法。 

        return Promise.reject(error);

Promise.resolve

        - 返回一个状态由给定value决定的Promise对象。如果该值是thenable(即,带有then方法的对象),返回的Promise对象的最终状态由then方法执行决定;否则的话(该value为空,基本类型或者不带then方法的对象),返回的Promise对象状态为fulfilled,并且将该value传递给对应的then方法。通常而言,如果你不知道一个值是否是Promise对象,使用Promise.resolve(value) 来返回一个Promise对象,这样就能将该value以Promise对象形式使用。   

怎么创建一个 Promise

Promise 对象是由关键字 new 及其构造函数来创建的。

const myFirstPromise = new Promise((resolve, reject) => {
 // ?做一些异步操作,最终会调用下面两者之一:
 //
 // resolve(someValue); // fulfilled
 // ?或
 // reject("failure reason"); // rejected
});

想让某个函数拥有 Promise 功能?让他放回一个 Promise 对象就可以了:

function myAsyncFunction(url) {
 return new Promise((resolve, reject) => {
 const xhr = new XMLHttpRequest();
 xhr.open("GET", url);
 xhr.onload = () => resolve(xhr.responseText);
 xhr.onerror = () => reject(xhr.statusText);
 xhr.send();
 });
};

Demo: 1 -- 创建一个 GET 请求的简单函数

function get(url) {
 // 返回一个 promise 对象.
 return new Promise(function(resolve, reject) {
 // 创建一个 XML 对象
 var req = new XMLHttpRequest();
 req.open('GET', url);

 req.onload = function() {
  
  if (req.status == 200) {
  // 请求 200的时候处理 response 
  resolve(req.response);
  }
  else {
  // 处理请求错误信息
  reject(Error(req.statusText));
  }
 };

 // 处理网络错误信息
 req.onerror = function() {
  reject(Error("Network Error"));
 };

 // 发送请求
 req.send();
 });
}

现在我们来使用吧

get('story.json').then(function(response) {
 console.log("Success!", response);
}, function(error) {
 console.error("Failed!", error);
})

Demo: 2 -- 创建一个图片上传的 Promise 函数

function imgLoad(url) {
 //创建一个图片上传的 Promise() constructor;
 return new Promise(function(resolve, reject) {
  
  var request = new XMLHttpRequest();
  request.open('GET', url);
  request.responseType = 'blob';
  
  request.onload = function() {
  if (request.status === 200) {
  
   resolve(request.response);
  } else {
  
   reject(Error('Image didn\'t load successfully; error code:' + request.statusText));
  }
  };
  request.onerror = function() {
  
   reject(Error('There was a network error.'));
  };
  
  request.send();
 });
 }

 // 挂载到 body 上面去
 var body = document.querySelector('body');
 var myImage = new Image();
 
 // 使用
 imgLoad('myLittleVader.jpg').then(function(response) {
 
 //第一步 处理 resolve() method.
 var imageURL = window.URL.createObjectURL(response);
 myImage.src = imageURL;
 body.appendChild(myImage);
 
 }, function(Error) {
 
 // 处理错误
 console.log(Error);
 });

下篇文章预告

大概内容:promise 和错误处理详解,JavaScript 异步和 promise

参考

  • MDN-Promise
  • Google-Develop

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
一个js封装的不错的选项卡效果代码
Feb 15 Javascript
用JavaScript编写COM组件的步骤
Mar 17 Javascript
从父页面读取和操作iframe中内容方法
Jul 25 Javascript
js jquery验证银行卡号信息正则学习
Jan 21 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
Apr 27 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
May 07 Javascript
js实现网页自动刷新可制作节日倒计时效果
May 27 Javascript
jQuery实现模拟marquee标签效果
Jul 14 Javascript
ES6数组的扩展详解
Apr 25 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
May 31 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
Sep 28 Javascript
angular 表单验证器验证的同时限制输入的实现
Apr 11 Javascript
详解VS Code使用之Vue工程配置format代码格式化
Mar 20 #Javascript
vue使用Proxy实现双向绑定的方法示例
Mar 20 #Javascript
vue实现可视化可拖放的自定义表单的示例代码
Mar 20 #Javascript
详解JavaScript作用域和作用域链
Mar 19 #Javascript
vue双向绑定及观察者模式详解
Mar 19 #Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
Mar 19 #Javascript
在vue中使用G2图表的示例代码
Mar 19 #Javascript
You might like
phpstorm编辑器乱码问题解决
2014/12/01 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
php解决安全问题的方法实例
2019/09/19 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
微信小程序整个页面的自动适应布局的实现
2020/07/12 Javascript
vue+AI智能机器人回复功能实现
2020/07/16 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
django如何连接已存在数据的数据库
2018/08/14 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
Python 存取npy格式数据实例
2020/07/01 Python
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
毕业自我鉴定
2013/11/05 职场文书
农民致富事迹材料
2014/01/23 职场文书
销售总经理岗位职责
2014/03/15 职场文书
家长学校培训材料
2014/08/20 职场文书
作风转变年心得体会
2014/10/22 职场文书
MySQL分库分表与分区的入门指南
2021/04/22 MySQL
nginx lua 操作 mysql
2022/05/15 Servers