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 相关文章推荐
Ext JS Grid在IE6 下宽度的问题解决方法
Feb 15 Javascript
jquery 简单的进度条实现代码
Mar 11 Javascript
jquery ajax属性async(同步异步)示例
Nov 05 Javascript
javascript框架设计读书笔记之模块加载系统
Dec 02 Javascript
Jquery on方法绑定事件后执行多次的解决方法
Jun 02 Javascript
AngularJS 整理一些优化的小技巧
Aug 18 Javascript
JS获取浮动(float)元素的style.left值为空的快速解决办法
Feb 19 Javascript
JQuery Ajax 异步操作之动态添加节点功能
May 24 jQuery
微信小程序block的使用教程
Apr 01 Javascript
Puppeteer环境搭建的详细步骤
Sep 21 Javascript
js中this的指向问题归纳总结
Nov 28 Javascript
jQuery实现简单日历效果
Jul 05 jQuery
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
CI框架简单邮件发送类实例
2016/05/18 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
javascript 模拟点击广告
2010/01/02 Javascript
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
js和jquery中循环的退出和继续学习记录
2014/09/06 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
2016/05/18 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
微信小程序实现canvas分享朋友圈海报
2020/06/21 Javascript
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
Python中实现switch功能实例解析
2018/01/11 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
仓库保管员岗位职责
2013/12/20 职场文书
运动会开幕式邀请函
2014/01/22 职场文书
如何撰写岗位职责
2014/02/01 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
买卖车协议书
2014/04/21 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
先进班集体申报材料
2014/12/26 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
我的中国梦主题班会
2015/08/14 职场文书
学生会部长竞选稿
2015/11/19 职场文书