美文网首页
ECMAScript 6---Promise对象

ECMAScript 6---Promise对象

作者: ForeverYoung20 | 来源:发表于2019-01-17 11:27 被阅读13次

    所谓promise,其实就是异步编程的一种解决方案。

    特点:

    promise对象状态不受外界影响(由异步操作的结果决定)。

    1. pending:进行中
    2. resolved(fulfilled):已完成
    3. rejected:已失败

    一旦状态改变,将不会再变(状态凝固,保持不变)

    1. pending → resolved
    2. pending → rejected

    缺点:

    1. 无法中途取消promise
    2. 如果不设置回调函数,promise内部抛出的错误无法反应到外部
    3. pending状态下,无法得知进展阶段

    ==============================================

    var promise = new Promise( (resolve,reject) => {

    if (/*异步操作成功*/) {
    
        resolve(value);
    
    } else {
    
        reject(error);
    
    }
    

    } )

    ==============================================

    注:Promise是一个构造函数,用来创建promise实例。参数为一个函数,该函数有两个参数:

    1. resolve:当异步操作返回成功时调用,并将结果传递给回调函数
    2. reject:当异步操作返回失败时调用,并将错误信息传递给回调函数

    ==============================================

    promise.then ( (value) => {

    //success
    

    }, (err) => {

    //failure
    

    } )

    ==============================================

    注:then方法可以传递两个回调函数作为参数(两个函数均接受promise对象传出的值作为参数)

    1. 第一个回调函数为Promise状态pending → resolve时调用
    2. 第二个回调函数为Promise状态pending → reject时调用,可选

    p1和p2是两个promise实例,当p2的resolve方法将p1作为参数时:

    1. p1为pending状态时,p2的回调函数会等待p2状态的改变;
    2. p2为resolve状态时,p2的回调函数立即调用
    3. p2为reject状态时,p2的回调函数立即调用,但是此时p2的状态无效,以p1状态为准,触发p2回调函数中的catch方法

    Promise.prototype.then()

    then方法返回的是一个新的promise实例,因此可以采用链式写法(前一个回调函数执行完毕,会把返回的结果作为参数传递给下一个回调函数,以此类推)

    Promise.prototype.catch()

    和.then(null,reject)等价,用于指定发生错误时的回调。异步操作状态变为reject时,调用catch方法,当then方法内抛出异常时,也会被catch方法捕获

    Promise.all()

    用于将多个promise实例包装成一个promise实例,参数为一个包含多个promise实例的数组,如果数组元素不是promise实例,会先调用Promise.resolve方法转换为promise实例

    1. p1, p2, p3均为resolve时,返回的p也为resolve
    2. p1, p2, p3有一个为reject时,p为reject,此时第一个被reject的返回值会传递给p的回调函数

    Promise.race()

    参数同all方法,不同的是,当参数中的实例有一个返回率先改变状态,p的状态便随之改变。

    Promise.resolve()

    将现有对象转换为promise对象。

    1. 参数是一个promise实例时,不做修改返回。
    2. 参数是一个thenable(含有then方法的对象)时,会先转换为promise对象,并立即执行thenable对象内的then方法。
    3. 参数不是一个对象时,返回一个新的promise对象,状态为resolve。
    4. 当没有参数时,直接返回一个状态为resolve的promise对象。

    Promise.reject()

    返回一个状态为reject的promise对象。

    done()

    处于回调链的尾端,保证最后一个then或者catch方法抛出的错误可以接收到。

    finally()

    无论最后的状态是哪一个,都会执行的代码块。

    相关文章

      网友评论

          本文标题:ECMAScript 6---Promise对象

          本文链接:https://www.haomeiwen.com/subject/ewobdqtx.html