一、概念

Promise是异步编程的解决方案之一,与事件驱动+回调函数并列。

Promise是专门为异步编程设计的封闭的一次性用品,封闭体现在只有异步操作的结果能改变其状态,其他任何操作都不能改变其状态。一次性体现在一旦新建就会运行而且一旦状态改变,就不会再改变。

注意1:调用resolve或reject并不会中止Promise内代码的执行,不管是同步还是异步代码,就算是ajax这种异步操作,将这些异步操作添加到事件循环的末尾的动作也是同步的。但是理论上来说,resolve和reject调用之后Promise的状态一定会改变,根据它一次性的特点,它已经没有意义了,后面不应该有代码,可以在resolve和reject前加上return,这样它们后面的代码就不会执行了。

注意2:Promise会吃掉错误,Promise内部发生的语法错误不影响外部代码的执行。这也体现出Promise是真的封闭

二、语法

const promise = new Promise(function(resolve,reject){
// asynchronous code
if(/*success*/){
resolve(value);
}else{
reject(error);
}
});

进阶用法1:resolve或reject的参数是一个promise,这个参数的promise将决定外部promise的状态

const p1 = new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('fail')), 3000)
})
const p2 = new Promise(function (resolve, reject) {
setTimeout(() => resolve(p1), 1000)
})
p2
.then(result => console.log(result))
.catch(error => console.log(error))
//Error:fail
进阶用法2:then和catch可以链式调用,返回一个新的Promise实例,如果在then中不显式返回一个promise实例,then会将你return的data(字符串啊什么的)当做默认promise对象的resolve的参数,并执行resolve(data)
进阶用法3:catch(error)是then(null,function(error))的别名,除了处理rejected状态,还可以捕获Promise中抛出的错误。
经测试,then中的reject处理函数也能捕获promise中抛出的错误,可以说,reject函数的作用等同于抛出错误。
错误具有冒泡性质,总会被后面的catch捕获。推荐使用catch代替then的第二个参数。

三、实例:https://github.com/WHITE-ILMARE/Front-End-Learning-Demos/tree/master/ES6/promise

1.控制最基础的异步——setTimeout();

2.对单个Ajax请求的控制

3.Promise.all:各个子Promise的结果会存储在数组中作为外部Promise实例resolved的参数。

若子Promise有catch方法,就调用自己的catch,若没有,就调用外部Promise实例的catch方法。就语义上来说,这样做阻止了子Promise的一次reject导致多次catch,比较有意义。可以根据需要,决定统一处理rejected还是定制化处理rejected。

四、理解

写了几个Promise实例,Promise的优点在哪?

1.形式上,想一下jquery中的$.get(url,callback(data)),如果用promise,可以写成new Promise(function(...){$.get(url,resolve(data))}).then(data),就是把传统的回调函数掏出来写在外边了,听说这是同步的写法,我还不明白什么叫同步的写法,没有回调就是同步的写法??总而言之,就是形式上的简化。

 2.理解方式上,我在读了ES6 JavaScript Promise的感性认知« 张鑫旭-鑫空间-鑫生活 - zhangxinxu这篇文章后想到,将回调函数的写法转换成promise.then().then()这种写法易于让人读懂代码,更容易理解代码。因为这种写法代表一种逻辑,应该就是上一条说的同步的逻辑,更符合现实世界人们的思维方式,所以便于理解,提高了代码可读性和结构。

Promise实践的更多相关文章

  1. jquery的promise实践--连续加载图片

    在javascript设计模式实践之代理模式--图片预加载中用代理模式实现了图片预加载功能. 现在就更进一步,完成一个能够一张一张的连续图片加载的功能. 功能: 1.一张一张加载图片. 2.加载错误, ...

  2. 一次Promise 实践:异步任务的分组调度

    起因是在工作中遇到一个问题,可以用一个二维数组简单描述: [[1,2,3],[4,5,6],[7,8,9]] 这里每个数字都代表“一个异步计算任务”, 每个子数组把1个或多个计算任务划分成组,要求是: ...

  3. javascript中的promise和deferred:实践(二)

    javascript中的promise和deferred:实践(二) 介绍: 在第一节呢,我花了大量的时间来介绍promises和deferreds的理论.现在呢,我们来看看jquery中的promi ...

  4. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)

    在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...

  5. vue实践---vue结合 promise 封装原生ajax

    有时候不想使用axios这样的外部依赖,想自己封装ajax,这里有两种方法 方法一,在单个页面内使用 封装的代码如下: beforeCreate () { this.$http = (() => ...

  6. ES6之Promise学习与实践

    1.前言 在平时的业务开发中,前端通常需要请求后台获取数据,或者NodeJs读取文件等等一系列的异步操作,我们通常需要利用异步操作的结果或者对异步操作的结果进行处理.通常我们的解决方案是:在异步操作成 ...

  7. Promise最佳实践(转)

    本文作者:IMWeb dekuchen 原文出处:IMWeb社区 未经同意,禁止转载 有关Promise的几个问题 基础概念 一:什么是Promise 国内比较流行的看法: 阮一峰: Promise ...

  8. Promise里捕捉错误的最佳实践

    Promise里的同步部分不需要try catch new Promise((resolve, reject) => { throw new Error('error'); setTimeout ...

  9. 大白话讲解Promise(二)理解Promise规范

    上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...

随机推荐

  1. Python下划线简介

    Python中下划线的5种含义 分享一篇文章:The Meaning of Underscores in Python. 本文介绍了Python中单下划线和双下划线("dunder" ...

  2. 23. Merge k Sorted Lists (JAVA)

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  3. CentOS7 安装并配置MySQL8.0

    安装环境 linux版本:CentOS 7.6 x64 Mysql:8.0 在CentOS中默认安装有MariaDB,但是我们需要的是MySQL,安装MySQL可以覆盖MariaDB. MariaDB ...

  4. 100-days: twenty-six

    Title: The Guardian(英国卫报) view on the Notre Dame fire: we share France's terrible loss Notre Dame 巴黎 ...

  5. VS2017上使用RDLC Report

    1,要先在“工具”-“扩展与更新”中搜索“RDLC"进行安装.(出来的结果有两个,安装第一个有三个星评分的,第二个是没评分的) 2,在NuGet包管理器中搜索”reportviewercon ...

  6. fROM PPV report

    Month search help: include rmcs0f0m. s_month for s001-spmon at selection-screen on value-request for ...

  7. JAVA课程设计-教学论坛系统

    团队课程设计博客 1. 团队名称:教学论坛系统设计团队 团队成员介绍: 郑佳亮(组长):201721123022,查看帖子,点赞,参与度,搜索,管理员删帖的后端,点赞,参与度前端 李于程(组员):20 ...

  8. 微信支付自带的简易log

    using System; using System.Collections.Generic; using System.Web; using System.IO; namespace WxPayAP ...

  9. Finance版本计划

    2.0.0.3 1. 支持自定义报表 提供页面自定义报表,根据存储过程,前端页面传参调用 根据存储过程数据集控制简单样式(数字靠右,列宽) 2. 支持报表公式可修改 定义公式规则(文档) 2.0.0. ...

  10. nodeJS接入微信公众平台开发

    一.写在前面的话   Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...