ES6 Promise对象的含义和基本用法分析


Posted in Javascript onJune 14, 2019

本文实例讲述了ES6 Promise对象的含义和基本用法。分享给大家供大家参考,具体如下:

1.Promise的含义

Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理更强大。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件 (通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。

Promise对象有以下2个特点:

1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)Resolved(已完成)Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved;从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象田静回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

有了Promise对象,就可以把异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供了统一的接口,使得控制异步操作更加容易。

2.基本用法

ES6规定,Promise对象是一个构造函数,用来生成Promise实例

var promise = new Promise(function(resolve,reject){
 // ... some code
 if(/* 异步操作成功 */){
  resolve(value);
 }else{
  reject(error);
 }
});

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject。它们是两个函数,又JavaScript引擎提供,不是自己部署。

resolve函数的作用,将Promise对象的状态从“未完成”变成“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用是,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

Promise实例生成以后,可以用then方法分别制定Resolved状态和Rejected状态的回调函数:

promise.then(function(value){
 // sucess
},function(error){
 // failure
});

then方法可以接受2个回调函数作为参数,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。

下面是一个Promise对象的简单例子:

function timeout(ms){
 return new Promise((resolve,reject)=>{
  setTimeout(resolve,ms,'done');
 });
}
timeout(100).then((value)=>{
 console.log(value);
});

上面代码中,timeout方法返回一个Promise实例,表示一段事件以后才会发生的结果。过了指定的时间(ms参数)以后,Promise实例的状态变为Resolved,就会触发then方法绑定的回调函数。

Promise新建后就会立即执行

let promise = new Promise(function(resolve,rejeact){
 console.log('Promise');
 resolve();
});
promise.then(function(){
 console.log('Resolved');
});
console.log('Hi');
// Promise
// Hi
// Resolved

上面代码中,Promise新建后立即执行,所以首先输出的是”Promise”,然后then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以”Resolved”最后输出。

下面是异步加载图片的例子:

function loadImageAsync(url){
 return new Promise(function(resolve,reject){
  var image = new Image();
  image.onload = function(){
   resolve(image);
  };
  image.onerror = function(){
   reject(new Error('Could not load image at' + url));
  };
  image.src = url;
 });
}

下面是一个用Promise对象实现Ajax操作的例子:

var getJSON = function(url){
 var promise = new Promise(function(resolve,reject){
  var client = new XMLHttpRequest();
  client.open('GET',url);
  client.onreadystatechange = handler;
  client.responseType = 'json';
  client.setRequestHeader('Accept','application/json');
  client.send();
  function handler(){
   if(this.readyState !== 4){
    return;
   }
   if(this.status === 200){
    resolve(this.response);
   }else{
    reject(new Error(this.statusText));
   }
  }
 });
 return promise;
};
//
getJSON('/posts.jons').then(function(json){
 consoloe.log(json);
},function(error){
 console.log('出错了');
});

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
向大师们学习Javascript(视频与PPT)
Dec 27 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 Javascript
Node.js中的流(Stream)介绍
Mar 30 Javascript
javascript html5实现表单验证
Mar 01 Javascript
js控制TR的显示隐藏
Mar 04 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
Sep 02 Javascript
js实现登录与注册界面
Nov 01 Javascript
在vue项目中引入highcharts图表的方法(详解)
Mar 05 Javascript
JS实现点击按钮可实现编辑功能
Jul 03 Javascript
浅谈layui里的上传控件问题
Sep 26 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
May 09 Javascript
Webpack的Loader和Plugin的区别
Nov 09 Javascript
ES6顶层对象、global对象实例分析
Jun 14 #Javascript
ES6数组与对象的解构赋值详解
Jun 14 #Javascript
简单了解Ajax表单序列化的实现方法
Jun 14 #Javascript
通过JS深度判断两个对象字段相同
Jun 14 #Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
Jun 14 #Javascript
利用JavaScript将Excel转换为JSON示例代码
Jun 14 #Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
Jun 14 #Javascript
You might like
php中解析带中文字符的url函数分享
2015/01/20 PHP
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
初识Node.js
2015/03/20 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
JS实现的全排列组合算法示例
2017/10/09 Javascript
微信小程序实现tab和swiper切换结合效果
2020/07/17 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
python中对list去重的多种方法
2014/09/18 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
python3音乐播放器简单实现代码
2020/04/20 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
Python中格式化字符串的四种实现
2020/05/26 Python
基于python代码批量处理图片resize
2020/06/04 Python
创业计划书如何吸引他人眼球
2014/01/10 职场文书
销售顾问岗位职责
2014/02/25 职场文书
体育之星事迹材料
2014/05/11 职场文书
煤矿安全承诺书
2014/05/22 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
Python实现信息轰炸工具(再也不怕说不过别人了)
2021/06/11 Python
JS封装cavans多种滤镜组件
2022/02/15 Javascript
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js