ES6 Promise理解

本文详细解析了Promise对象的基本用法及高级特性,包括.then().catch()的正确使用方式、Promise.resolve()与Promise.reject()的区别、Promise.all的工作原理以及如何利用Promise.done确保捕获所有异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

catch方法

.then().catch(cb)

相当于:

.then(null,cb)

Promise对象的错误具有冒泡的性质,会一直向后传递,直到被捕获,推荐使用.catch方法,因为他不但能捕获前面then方法中的异常且能捕获较早之前未捕获到的异常,而then的第二个参数不能捕获第一个参数中的异常。

// bad
promise
  .then(function(data) {
    // success
  }, function(err) {
    // error
  });

// good
promise
  .then(function(data) { //cb
    // success
  })
  .catch(function(err) {
    // error
  });

Promise.resolve(arg)

将arg包装成Promise对象
1. arg为基本类型:

var a = 1;
Promise.resolve(1);

相当于:

new Promise(function(resolve){
    resolve(1);
});
  1. arg为Promise对象时直接返回arg
  2. arg为含有then属性的对象时,将arg转换成Promise对象后立即调用其then方法:
var arg = {
    then:function(resolve,reject){
        resolve(123);
    }
}
Promise.resolve(arg).then(function(value){
    console.log(value)
});
输出:123

Promise.reject(arg)

不管arg为什么值都会原封不动的传递给下面的回调:

var arg = {
then:function(resolve,reject){
        reject('err')
    }
}
Promise.reject(arg).catch(e => {
    console.log(e === arg);
});
输出:true

Promise.all

其参数必须是具有Iterator接口。例如数组,且其中的参数必须是Promise实例,若不是,则调用Promise.resolve将其包装成Promise实例。

当所有参数都fulfilled后,将所有参数的返回值包装成数组,传递给下面的then方法
只要有一个参数reject,则 Promise.all 的状态变为rejected,且将第一个reject实例的返回值传递给下面的then方法。

var p1 = function () {
    var flag = true;
    return new Promise(function (resolve, reject) {
        if (flag) {
            resolve(1);
        } else {
            reject(0)
        }

    });
};
var p2 = function () {
    return new Promise(function (resolve) {
        resolve(123)
    });
};
Promise.all([p1(),p2()]).then(function ([r1,r2]) {
   console.log(r1)
   console.log(r2)
}).catch(function (err) {
    console.log(err)
});
输出:
1
123

将上面代码中的flag置为false,则输出:0
先将flag改为false后,同时在执行p1时为p1添加catch则p1相当于没有发生错误,其reject的值会传递给promise.all的then参数:

var p1 = function () {
    var flag = false;
    return new Promise(function (resolve, reject) {

        if (flag) {
            resolve(1);
        } else {
            reject(0);
        }

    });
};
var p2 = function () {
    return new Promise(function (resolve) {
        resolve(123)
    });
};
Promise.all([p1().catch(function () {
    console.log('in err');
    return 'inn err';
}),p2()]).then(function ([r1,r2]) {
    console.log(r1)
    console.log(r2)
}).catch(function (err) {
    console.log(err)
});
输出:
in err
inn err
123

Promise.done

Promise最后不管是then还是catch,若最后一个方法抛出的错误则无法捕获到,则将done方法放在回调链的末端,保证抛出可能出现的异常。

Promise.prototype.done = function(resolve,reject){
    this.then(resolve,reject).catch(function(reason){
        setTimeout(()=>{throw rease},0);//抛出全局错误
    })
}

Promise.finally

不管最终的Promise状态如何都会执行

Promise.prototype.finally = function(cb){
  this.then(
        value => Promise.resolve(cb(value)).then(msg => {return msg}),//这里的resolve目的是将cb封装成Promise对象
        reason => Promise.resolve(cb(value)).then(msg => {return msg})//这里的resolve目的是将cb封装成Promise对象
    )
}
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值