`
乱蓬头199303
  • 浏览: 80435 次
文章分类
社区版块
存档分类
最新评论

Javascript 中的神器——Promise

阅读更多

 

摘要: 回调函数真正的问题在于他剥夺了我们使用 return 和 throw 这些关键字的能力。而 Promise 很好地解决了这一切

回调函数真正的问题在于他剥夺了我们使用 return 和 throw 这些关键字的能力。而 Promise 很好地解决了这一切

Promise概念

所谓 Promise,就是ES6原生提供的一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理

直接打印 console.dir(Promise) 来看看

520134_20160311003722741_755677508

这么一看就明白了,Promise是一个构造函数,自己身上有all、reject、resolve这几个眼熟的方法,原型上有then、catch等同样很眼熟的方法。这么说用Promise new出来的对象肯定就有then、catch方法

Promise特点

Promise 对象有以下两个特点

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

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

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

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

new一个Promise来看看:

Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。其实这里用“成功”和“失败”来描述并不准确,按照标准来讲,resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected。不过在我们开始阶段可以先这么理解,后面再细究概念。

在上面的代码中,我们执行了一个异步操作,也就是setTimeout,2秒后,输出“执行完成”,并且调用resolve方法。

运行代码,会在2秒后输出“执行完成”。注意!我只是new了一个对象,并没有调用它,我们传进去的函数就已经执行了,这是需要注意的一个细节。所以我们用Promise的时候一般是包在一个函数中,在需要的时候去运行这个函数,如:

在我们包装好的函数最后,会return出Promise对象,也就是说,执行这个函数我们得到了一个Promise对象。还记得Promise对象上有then、catch方法吧?这就是强大之处了,看下面的代码:

在runAsync()的返回上直接调用then方法,then接收一个参数,是函数,并且会拿到我们在runAsync中调用resolve时传的的参数。运行这段代码,会在2秒后输出“执行完成”,紧接着输出“随便什么数据”

这时候应该有所领悟,原来then里面的函数就跟我们平时的回调函数一个意思,能够在runAsync这个异步任务执行完成之后被执行。这就是Promise的作用;简单来讲,就是能把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。

当然,我把回调函数封装一下,给runAsync传进去也是一样吗,就像这样:

​​​​​​​

原文链接

 

 

分享到:
评论

相关推荐

    Javascript中的神器——Promise

    Promise in js 回调函数真正的问题在于他剥夺了我们使用 return 和 throw 这些关键字的能力。而 Promise 很好地解决了这一切。 2015 年 6 月,ECMAScript 6 的正式版 终于发布了。 ECMAScript 是 JavaScript 语言的...

    JavaScript凌厉开发——Ext详解与实践_源码清单

    JavaScript凌厉开发——Ext详解与实践_源码清单JavaScript凌厉开发——Ext详解与实践_源码清单JavaScript凌厉开发——Ext详解与实践_源码清单

    JavaScript网页开发——体验式学习教程.pdf

    这份"JavaScript网页开发——体验式学习教程.pdf"提供了一个深入理解JavaScript语法和实践的平台,帮助初学者和有一定基础的开发者提升技能。 教程首先会介绍JavaScript的基础知识,包括变量、数据类型(如字符串、...

    javaScript全面分析——中文版

    JavaScript全面分析——中文版是为想要快速理解和掌握JavaScript编程语言的学者精心编写的教程。JavaScript是一种广泛应用于Web开发的脚本语言,它在浏览器端运行,为网页添加交互性,使得用户界面更加生动活泼。本...

    JavaScript实战手册——第七版代码

    《JavaScript实战手册——第七版代码》是一本专为JavaScript开发者准备的实践指南,它涵盖了从基础到高级的各种JavaScript编程技术。这本书的代码示例旨在帮助读者深入理解语言机制,并提升在实际项目中的应用能力。...

    JavaScript程序设计——DOM访问实验报告.docx

    实验报告的主题是“JavaScript程序设计——DOM访问”,其目的是深入理解和掌握DOM(Document Object Model)在JavaScript中的应用,包括文档对象的属性、方法以及使用方式。DOM是HTML和XML文档的标准化表示,允许...

    JavaScript程序设计——页面设置与表单验证实验报告.docx

    实验报告的标题“JavaScript程序设计——页面设置与表单验证实验报告.docx”涉及的核心是JavaScript编程中的两个关键领域:页面设置和表单验证。在Web开发中,JavaScript是一种常用的客户端脚本语言,用于增强用户的...

    javascript(es6) promise 迷你书

    本书《JavaScript(ES6)Promise迷你书》是一本专注于ES6中Promise对象的迷你教程,它旨在向读者介绍Promise的概念、使用方法、原理,并指导读者如何自己动手实现一个Promise库。Promise是JavaScript中用于异步编程...

    javascript 学习资料——适合WEB初学者

    6. **ES6及以上版本的新特性**:包括箭头函数、模板字符串、解构赋值、let和const、Promise、async/await等,这些新特性使得JavaScript的代码更加简洁和易读。 7. **前端框架和库**:了解React、Vue.js、Angular等...

    JavaScript小案例——自动生成

    JavaScript不可抵挡的诱惑哦!JavaScript不可抵挡的诱惑哦!JavaScript不可抵挡的诱惑哦!

    JavaScript的一个promise库

    Promise是JavaScript中用于异步编程的一种解决方案,它提供了一种管理回调函数、处理异步操作的方法,使得代码更加清晰和易于理解。在JavaScript的世界里,Promise库如`q`是开发者常用的工具之一,用于处理复杂的...

    JavaScript程序调试——不调之调

    小K.二十几岁,刚刚转到一家软件咨询公司上班。刚刚进来也没有被安排什么事情做,...”噢.JavaScript。我在前一个公司都写了两年了.去给他们露两手吧。”小K面露微笑。和团队的老大Mike说了一下.小K就算正式入伙了

    JavaScript例子——计算

    在这个"JavaScript例子——计算"中,我们可能会看到如何利用JavaScript进行各种计算操作。博客链接指向了作者fuhao9611在iteye上的一个博客条目,尽管具体内容无法直接复制到这里,但我们可以基于常见的JavaScript...

    javascript手写简单的Promise

    javascript手写简单的Promise

    【JavaScript源代码】JavaScript中的Promise详解.docx

    JavaScript中的Promise是异步编程的关键工具,用于管理复杂的异步操作。Promise的出现解决了传统的回调地狱问题,使得异步代码更加清晰、可读性更强。下面将详细解释Promise的使用和核心概念。 **1. 创建Promise...

    适合新手学习的JavaScript实例(精)

    8. **ES6新特性**:ECMAScript 6(简称ES6)引入了许多新特性,如箭头函数、模板字符串、解构赋值、let/const、Promise等,这些都已逐渐成为现代JavaScript开发的必备知识。 9. **错误处理**:学习如何使用try......

    JavaScript框架高级编程——应用Prototype、YUI、Ext JS、Dojo、MooTools

    JavaScript框架高级编程——应用Prototype、YUI、Ext JS、Dojo、MooTools JavaScript框架高级编程——应用Prototype、YUI、Ext JS、Dojo、MooTools

    浅析Javascript ES6中的原生Promise_.docx

    Promise的出现极大地改善了JavaScript中的异步编程体验,解决了回调金字塔问题,使代码更易于理解和维护。尽管Promise本身不提供并行执行任务的能力,但配合其他工具如`Promise.all()`,可以有效地管理异步操作,...

Global site tag (gtag.js) - Google Analytics