Promise的定义

Promise 是异步编程的一种解决方案,比传统的解决方案回调函数和事件更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

可以把 Promise 理解成一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。它代表了一个异步操作的最终完成和最终失败。操作成功(resolve),操作失败(reject)。

promise的特点

promis的三中状态:

  • 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
  • 已兑现(fulfilled): 意味着操作成功完成。
  • 已拒绝(rejected): 意味着操作失败。

对象的状态不受外界的影响

只有异步的操作结果,可以决定其当前是那一种状态,其他任何操作都无法改变这个状态。

一旦状态改变,就不会在变,任何时候只有这个结果

Promise对象的状态改变,只有两种可能:

  • 从pending变为fulfilled
  • 从pending变为rejected

只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。

promis的缺点

  • 首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。
  • 其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
  • 第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

创建Promise

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

var promise = new Promise(function(resolve, reject) {// 进行异步操作,最终会调用下面两者之一://  resolve(someValue); // fulfilled//  reject("failure reason"); // rejected
});

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

实例:

let myFirstPromise = new Promise(function(resolve, reject){//当异步代码执行成功时,我们才会调用resolve(...), 当异步代码失败时就会调用reject(...)//在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.setTimeout(function(){resolve("成功!"); //代码正常执行!}, 250);
});myFirstPromise.then(function(successMessage){//successMessage的值是上面调用resolve(...)方法传入的值.//successMessage参数不一定非要是字符串类型,这里只是举个例子console.log("Yay! " + successMessage);
});

对于已经实例化过的 promise 对象可以调用 promise.then() 方法,传递 resolve 和 reject 方法作为回调。

promise.then() 是 promise 最为常用的方法。

promise.then(onFulfilled, onRejected)

promise简化了对error的处理,上面的代码我们也可以这样写:

promise.then(onFulfilled).catch(onRejected)

Promisethen方法:

Promise.prototype.then 方法返回的是一个新的 Promise 对象,因此可以采用链式写法。

getJSON("/posts.json").then(function(json) {return json.post;
}).then(function(post) {// proceed
});

上面的代码使用 then 方法,依次指定了两个回调函数。第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。如果前一个回调函数返回的是Promise对象,这时后一个回调函数就会等待该Promise对象有了运行结果,才会进一步调用。

getJSON("/post/1.json").then(function(post) {return getJSON(post.commentURL);
}).then(function(comments) {// 对comments进行处理
});

这种设计使得嵌套的异步操作,可以被很容易得改写,从回调函数的"横向发展"改为"向下发展"。

Promise.catch方法:

Promise.prototype.catch 方法是 Promise.prototype.then(null, rejection) 的别名,用于指定发生错误时的回调函数。

getJSON("/posts.json").then(function(posts) {// some code
}).catch(function(error) {// 处理前一个回调函数运行时发生的错误console.log('发生错误!', error);
});

Promise 对象的错误具有"冒泡"性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个 catch 语句捕获。

getJSON("/post/1.json").then(function(post) {return getJSON(post.commentURL);
}).then(function(comments) {// some code
}).catch(function(error) {// 处理前两个回调函数的错误
});

JavaScript Promise对象相关推荐

  1. JavaScript Promise对象详解

    Promise是JavaScript异步操作解决方案.介绍Promise之前,先对异步操作做一个详细介绍. JavaScript的异步执行 概述 Javascript语言的执行环境是"单线程 ...

  2. JavaScript:学习笔记(9)——Promise对象

    JavaScript:学习笔记(9)--Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...

  3. promise用法_【JavaScript 教程】异步操作——Promise 对象

    作者 | 阮一峰 概述 Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口.它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操 ...

  4. JavaScript异步编程(1)- ECMAScript 6的Promise对象

    JavaScript的Callback机制深入人心.而ECMAScript的世界同样充斥的各种异步操作(异步IO.setTimeout等).异步和Callback的搭载很容易就衍生"回调金字 ...

  5. JavaScript简餐——Promise对象的实例方法

    文章目录 前言 一.Promise的实例方法 1.Promise.prototype.then() 2.Promise.prototype.catch() 3.Promise.prototype.fi ...

  6. javascript中的异步调用,promise对象,async/await用法

    原生javascript中的的回调函数 即callback 就是通过回调函数来通知主程序 对于io 密集的非常好用:eg. file,DB读写,网络访问 异步: javascript就是个单线程语言, ...

  7. javascript之异步操作理解---回调函数,async,await以及promise对象

    javascript之异步操作理解---回调函数,async,await以及promise对象 概述 概述 写在前面:虽然平时做项目,但是发现自己写的代码还是很烂.最近接触了一个对性能要求比较高的项目 ...

  8. 【JavaScript 教程】ES6 中的 Promise对象 详解

    [JavaScript 教程]ES6 中的 Promise对象 详解 1.Promise对象含义 promise是异步编程的一种解决方法. 所谓promise,简单说是一个容器,里面保存着某个未来才会 ...

  9. Javascript 在循环中使用Promise对象

    先看一个生成Promise对象的方法 function createPromise() {var promise;promise = new Promise(function(resolve, rej ...

最新文章

  1. symbian 根据指定的权限找到对应的API:Functions listed by capability
  2. CI 模型公用查询函数
  3. 有兴趣吗?程序员分手手册,教你如何恢复单身
  4. Java基础入门笔记-包装类
  5. Oracle sqlserver mysql的自增变量设置
  6. python中魔法函数_02 python中魔法函数
  7. xml 和android脚本之家,Android开发之XML文件解析的使用
  8. Hadoop入门扫盲:hadoop发行版介绍与选择
  9. CSS缩小窗口时,背景图出现右侧空白
  10. findfont: Font family [‘Times New Roman‘] not found. Falling back to DejaVu Sans.
  11. Google 加入反 IE6 联盟:IE6 真的能被消灭吗?
  12. 浅谈今天所学的Jquery 中的filter()方法
  13. 【WPA TSP】基于matlab狼群算法求解旅行商问题【含Matlab源码 211期】
  14. 数据库安全关键技术之数据库脱敏技术详解
  15. kindle看pdf不清楚_Kindle 对 PDF 的支持真的很糟糕吗?
  16. 作业:欧拉公式以及凉鞋问题
  17. 破解Windows7开机密码
  18. MSP432E401Y-按键中断点灯
  19. 人机协同变电站智能化发展,嵌入式为电网安全护航
  20. gradle-6.5.1-all 快速下载

热门文章

  1. ngxin做http强制跳转https,接口的POST请求变成了GET
  2. 2018年AI要怎么“玩”?李飞飞和李开复在达沃斯论坛上给出这几点…
  3. 多领域合作 浪潮与美亚柏科赋能信息安全
  4. .net快速创建PDF文档 by c#
  5. ASP.NET的内置对象
  6. IMAP与POP3的比较
  7. Q1 SpringBoot启动类如何作为配置类注册进Spring容器的?(ok)
  8. python培训多久能入职_Python学到什么程度可以面试工作?
  9. 【HISI系列】之Hi3559A V100R001C02SPC010文档及SDK
  10. linux查找、搜索字符或文件