promise的介绍和使用

//Promise 是一个es6的原生对象,从它可以获取异步操作的消息,承诺了未来要发生的事,用来传递异步操作的信息
//Promise 有三种状态  pending等待态 fulfiled成功态 rejected失败态
//一旦promise被 resolve或reject,就不能再迁移其他任何状态 即状态immutable

//promise 的基本过程
//1.初始化Promise状态 pending
//2.立即执行Promise中传入的fn函数,将Promise内部resolve,reject函数作为参数传递给fn,按事件机制时机处理
//3.执行then()注册回调处理数组,then方法可被同一个promise调用多次
//4.Promise里的关键要保证,then方法传入的参数 onFulfilled 和 onRejected,必须在then方法被调用的那一轮事件循环之后的新执行栈执行  


//promise用来解决回调地狱,可以支持多个并发的要求,获取并发请求中的数据
//优点
//有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免层层嵌套的回调函数
//Promise对象提供统一的接口,使得控制异步操作更加容易
//缺点
//无法取消Promise,一旦新建它就会立即执行,无法中途取消
//如果不设置回调函数,Promise内部抛出的错误,不会反应到外部
//当处于pending,无法得知Promise状态

//Promise 用法
//1
//Promise的构造函数接收一个参数:函数,并且这个函数需要传入两个参数
//resolve:异步操作执行成功后的回调函数
//reject:异步操作执行失败后的回调函数
let p = new Promise((resolve, reject) => {
    setTimeout(() => {
        let num = parseInt(Math.random() * 10);
        if (num < 6) {
            resolve('111')
        } else {
            reject('222')
        }
    }, 1000)
})
//then中传两个参数,then方法可以接受两个回调,第一个是resolve回调,第二个是reject回调 
//catch指定reject的回调
p.then(res => {
    console.log(res);
}, rej => {
    console.log(rej)
}).catch(rej => {
    console.log(rej)
});
//then 链式调用
let promiseFunction = function (index) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(index)
        }, 2000)
    })
}
promiseFunction(1).then(res => {
    console.log(res);
    return promiseFunction(2)
}).then(function (res) {
    console.log(res);
})



//Promise.all 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
//多个 Promise 任务同时执行。 如果全部成功执行,则以数组的方式返回所有 Promise 任务的执行结果。 如果有一个Promise 任务 rejected,则只返回 rejected 任务的结果。
let Promise1 = new Promise(function (resolve, reject) { })
let Promise2 = new Promise(function (resolve, reject) { })
let Promise3 = new Promise(function (resolve, reject) { })

let pAll = Promise.all([Promise1, Promise2, Promise3])
// 三个都成功,则成功    
pAll.then(function () { }, function () { })

//race的用法
//Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。
let p1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('success')
    }, 1000)
})

let p2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        reject('failed')
    }, 500)
})

Promise.race([p1, p2]).then((result) => {
    console.log(result)
}).catch((error) => {
    console.log(error)  // 打开的是 'failed'
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值