Promise 知识点

  • .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 的回调函数。

原文地址:https://www.cnblogs.com/cag2050/p/7543635.html