关于promise的一点感悟

186 阅读1分钟


// 函数fn1赋值一个匿名函数,这个匿名函数返回一个promise对象,promise对象执行成功后有返回值,为1

// new promise里一般写的是异步代码

const fn1 = () => {
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            resolve(1)
        },1000)
    })
};
const fn2 = () => {
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            resolve(2)
        },1000)
    })
};
// fn1和fn2执行后返回一个promise对象,promise可以进行链式调用,成功后返回的resolve的值,失败后返回rejeet里的值。
//.then里函数调用的就是resolve,参数就是reslove里的值;catch调用的是reject

const fn = ()=> {
    fn1().then(res1 => {
        console.log(res1) //1
    })
    fn2().then(res2=> {
        console.log(res2) //2
    })
}
//resolve()是用来表示promise的状态为fullfilled,有时不需要返回值写到里面
// 卡片基本信息
getChannelInformation:function(){
    return new Promise((resolve,reject)=>{
        Service.getChannelTab({},res => {
            this.basicProductInfo = res || [];
            console.log(this.basicProductInfo);
            resolve();
        })
    })
}

//使用async和await简化

const fn = async () =>{
    const res1 = await fn1();
    const res2 = await fn2();
    console.log(res1);// 1
    console.log(res2);// 2
}
// 搭配async 和 await一起使用
try {
    
} catch (error) {
    
}
// 但是要做并发请求时,还是要用到Promise.all()。有时需要2个请求一起请求完

const Fn = () => {
    Promise.all([fn1(),fn2()]).then(res => {
        console.log(res)
    })
}

//如果并发请求时,只要其中一个异步函数处理完成,就返回结果,此时不管结果本身是成功状态还是失败状态, 需要用到 Promise.race
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'
  })