• .done()

    Promise 对象的回调链,不管以then方法或catch方法结尾,要是最后一个方法抛出错误,都有可能无法捕捉到(因为 Promise 内部的错误不会冒泡到全局)。因此,我们可以提供一个done方法,总是处于回调链的尾端,保证抛出任何可能出现的错误。

  • promise 理解:

  1. 在程序中,只要返回了一个 promise 对象,如果 promise 对象不是 Rejected 或 Fulfilled 状态,then 方法就会继续调用。利用这个特性,可以处理多个异步逻辑。
  2. promise 的状态改变为 rejected 后,promise 就会跳过后面的 then 方法。也就是,某个 then 里面发生异常后,就会跳过 then 方法,直接执行 catch。

    出处:https://github.com/nodejh/nodejh.github.io/issues/23
  • Promise 的链式调用。也就是 promise().then().then().catch() 的形式

  • Promise 新建后就会立即执行。

  • Promise.resolve方法可以将现有对象转为Promise对象。

  • Promise.done方法,总是处于回调链的尾端,保证向全局抛出任何可能出现的错误。

    解决的问题:

    Promise对象的回调链,不管以then方法或catch方法结尾,要是最后一个方法抛出错误,都有可能无法捕捉到(因为Promise内部的错误不会冒泡到全局)。

  • 如果没有报错,则会跳过catch方法。

  • catch方法返回的还是一个 Promise 对象,因此后面还可以接着调用then方法。

    catch方法后面then方法里面报错,就与前面的catch无关了。

  • catch方法之中,还能再抛出错误。

    可以再写一个catch来处理catch方法中抛出的错误。

  • Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。

  • 跟传统的try/catch代码块不同的是,如果没有使用catch方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码,即不会有任何反应。

    这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。

  • Promise.finally方法用于指定不管Promise对象最后状态如何,都会执行的操作。

    它与done方法的最大区别,它接受一个普通的回调函数作为参数,该函数不管怎样都必须执行。

  • 不知道或者不想区分,函数是同步函数还是异步函数,但是想用 Promise 来处理它,这时候就要用 Promise.try 方法。

  • 使用 Promise.try() 的好处:

  1. 让同步函数同步执行,异步函数异步执行
  2. 更好地管理异常
  • 如果Promise状态已经变成resolved,再抛出错误是无效的。

  • then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。

  • promise.then(): 第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。

promise.then()、promise.catch()、Promise.all()、、、

Promise 构造函数接受一个函数作为参数,该函数的2个参数分别是 resolve 和 reject。他们是2个函数,有 JavaScript 引擎提供,不用自己部署。

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

如果调用 resolve 函数和 reject 函数时带有参数,那么这些参数会被传递给回调函数。

Promise 实例生成以后,可以用 then 方法分别指定 Resolved 状态和 Rejected 状态的回调函数(then 方法的作用是为 Promise 实例添加状态改变时的回调函数)。

promise.then( function (value) {
// success
}, function (value) {
// failure
})

Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个 catch 语句捕获。注意:因此无法知道错误是哪个Promise产生的,除非设置了不一样的错误提示。

一般,不要在 then 方法中定义 Rejected 状态的回调函数(即 then 的第二个参数),而应该总是使用 catch。

如果没有使用 catch 方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码,即不会有任何反应。

catch 方法返回的还是一个 Promise 对象,因此还可以接着调用 then 方法。

如果没有报错,则会跳过 catch 方法,继续执行后面的 then 方法(如果后面还有 then 方法的话)。

getJson ('/post/1.json').then ( function (post) {
return getJson(post.commentURL)
}).then ( function (comments) {
// some code
}).catch ( function (error) {
// 处理前面3个 Promise 产生的错误
})
var p = Promise.all([p1, p2, p3])

p的状态有 p1、p2、p3 决定,分成2种情况:

  1. 只有 p1、p2、p3 的状态都变成 Fulfilled,p 的状态才会变成 Fulfilled,此时 p1、p2、p3 的返回值组成一个数组,传递给 p 的回调函数。

  2. 只要 p1、p2、p3 中有一个被 Rejected,p 的状态就变成 Rejected,此时第一个被 Rejected 的实例的返回值会传递给 p 的回调函数。

Promise 知识点的更多相关文章

  1. promise知识点汇总

    Promise对象被写进ES6的规范当中,提供的是另外一种更加友好的对于异步编程的解决方案,在这之前大多使用的是回调函数和事件来实现异步编程. 怎么来理解Promise对象呢?对于这个ES6新加入的小 ...

  2. promise知识点小结

    断断续续学习es6也有一段时间了,趁着开学空闲对知识点做一些小结. 为什么使用promise 谈到Promise,我们知道,这是社区较理想的异步编程解决方案.想要掌握promise,我们首先要知道其提 ...

  3. ES6内容

    iterator 遍历器iterator makeIterator是个遍历器,生成遍历器对象it var it = makeIterator(['a', 'b']); it.next() // { v ...

  4. Promise原理实现(一):前置知识点

      实现promise首先需要了解如下知识点: 1: 高阶函数 (一个函数作为另外一个函数的参数,这个包含的函数就是高阶函数): outer是一个高阶函数,inner函数作为一个参数传递:此处也是闭包 ...

  5. 前端知识点回顾之重点篇——ES6的Promise对象

    Promise Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大. 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异 ...

  6. angular2系列教程(七)Injectable、Promise、Interface、使用服务

    今天我们要讲的ng2的service这个概念,和ng1一样,service通常用于发送http请求,但其实你可以在里面封装任何你想封装的方法,有时候控制器之间的通讯也是依靠service来完成的,让我 ...

  7. 【干货分享】前端面试知识点锦集03(JavaScript篇)——附答案

    三.JavaScript部分 1.谈谈你对Ajax的理解?(概念.特点.作用) AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是 ...

  8. ES6新特性:Javascript中内置的延迟对象Promise

    Promise的基本使用: 利用Promise是解决JS异步执行时候回调函数嵌套回调函数的问题, 更简洁地控制函数执行流程: 通过new实例化Promise,  构造函数需要两个参数, 第一个参数为函 ...

  9. 通过一道笔试题浅谈javascript中的promise对象

    因为前几天做了一个promise对象捕获错误的面试题目,所以这几天又重温了一下promise对象.现在借这道题来分享下一些很基础的知识点. 下面是一个面试题目,三个promise对象捕获错误的例子,返 ...

随机推荐

  1. PL/SQL Developer 使用中文条件查询时无数据的解决方法(转)

    原文地址: PL/SQL Developer 使用中文条件查询时无数据的解决方法 PL/SQL Developer 使用中文条件查询时无数据,这是由于字符集的不一致导致的. 执行以下sql命令:sel ...

  2. win10激活工具---KMSAutoNet

    win10激活工具---KMSAutoNet 1> 2> 3> 4> 5> 6> 8>

  3. SSM框架整合(实现从数据库到页面展示)

    SSM框架整合(实现从数据库到页面展示) 首先创建一个spring-web项目,然后需要配置环境dtd文件的引入,环境配置,jar包引入. 首先让我来看一下ssm的基本项目配件.(代码实现) 1.首先 ...

  4. HDU 4091 Zombie’s Treasure Chest 分析 难度:1

    Zombie’s Treasure Chest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  5. 跟我一起学习ASP.NET 4.5 MVC4.0(四)

    前几个文章中介绍了一些关于MVC4.0的东东,今天我们来看一下登陆验证,也可以说是权限验证,即AuthorizeAttribute.这个可以使用在控制器Controller上,也可以使用在Action ...

  6. FormShortCut MainForm 和 二级FORM

    发现,主FORM 定义的快捷键,在二级FORM里也有效. 反过来,就无效. 这样的话,就要考虑 快捷键的冲突问题 了,本来以为不同的FORM 是独立的. http://codeverge.com/em ...

  7. 读书笔记 C# 控制台应用程序之Main方法浅析

    Main方法是C#控制台应用程序和Windows窗体应用程序的入口点.Main方法可以有形参,也可以没有,可以有返回值(int整型),也可以没有.如下定义: 无返回值.无形参的格式: static v ...

  8. Android系统移植与驱动开发

    21世纪,Android发展非常迅速,在市场上占有很大的比例,遥遥领先与iOS,很大程度上是因为任何人都可以利用Android的源代码定制完全属于自己的嵌入式开发系统,而不需要向Google交一分钱. ...

  9. JavaScript事件简述

    事件简述 技术一般水平有限,有什么错的地方,望大家指正. 事件是我们平时经常使用,这次就来了解一下事件.首先我们要明确几个概念,JavaScript是单线程,浏览器是多线程的,并不是所有的事件处理函数 ...

  10. <二叉树的基本操作>

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK ...