美文网首页
前端小白成长之09--Promise

前端小白成长之09--Promise

作者: Clover园 | 来源:发表于2020-05-20 21:12 被阅读0次

    1.Promise对象的then方法会返回一个全新的 Promise

    2.对象后面的then方法就是在为上ー个then返回的 Promise注册回调

    3.前面then方法中回调函数的返回值会作为后面then方法回调的参数

    4.如果回调中返回的是 Promise,那后面then方法的回调会等待它的结束

    5.promise的错误一般放在catch中去捕获,因为promise链条上任何一个错误都会向后传递直到被捕获,Catch更像是给整个promise链条注册的失败回调,而reject只对当时第一个promise的异常捕获


    一般promise错误用回调catch

    6.promise.all promise.race


    并行操作,全部完成才会返回一个数组,每个请求的响应数据
    Race返回第一个请求完成的结果,和all不同,all要全部完成
    const url3 = [
        'https://api.github.com',
        'https://api.github.com/users',
        'https://sssdfsd.com/sdfsd
    ]
    
    const promise = urls.map(m=>axios(m).catch(e=>'haha'));//处理每一个catch,catch也会产生一个then,进入下面all
    const  p =promise.all(promise);
    p.then(res=>{
        console.log(res); 
    }).catch(error=>console.log(error));
    
    -------------------
    es2020出来后
    const  promise  = Promise.allsettled(urls.map(item=>axios(item)))
    promise.then(res=>{
        //res就是[{statuc:'fulfiled',value:''},{statuc:'rejected',value:'',reason:Error}]失败也会进回调
    })
    

    7.微任务

    Promise.then
    Object.observe
    MutaionObserver
    process.nextTick(Node.js 环境)

    8.宏任务

    script(整体代码)
    setTimeout
    setInterval
    I/O
    UI交互事件
    postMessage
    MessageChannel
    setImmediate(Node.js 环境)

    async function t1() {
      let a = await "lagou";
      console.log(a);
    }
    t1();// lagou
    -------------------------------------------
    async function t2() {
      let a = await new Promise((resolve) => {});
      console.log(a);
    }
    t2()//一直在pending状态,啥也不打印
    -------------------------------------------------------
    async function t3() {
      let a = await new Promise((resolve) => {
        resolve();
      });
      console.log(a);
    }
    t3();//undefied
    -------------------------------------------
    
    async function t4() {
      let a = await new Promise((resolve) => {
        resolve("hello");
      });
      console.log(a);
    }
    t4();//hello
    -----------------------------------------
    async function t5() {
      let a = await new Promise((resolve) => {
        resolve("hello");
      }).then(() => {
        return "lala";
      });
      console.log(a);
    }
    t5();//lala
    -----------------------------------------
    async function t6() {
      let a = await fn().then((res) => {
        return res;
      });
      console.log(a);
    }
    async function fn() {
      await new Promise((resolve) => {
        resolve("lagou");
      });
    }
    t6();//Undefined fn没有返回值
    ------------------------------------------
    async function t7() {
      let a = await fn().then((res) => {
        return res;
      });
      console.log(a);
    }
    async function fn() {
      await new Promise((resolve) => {
        resolve("lagou");
      });
      return "lala";
    }
    
    t7();//lala
    ----------------------------------
    Promise.resolve(1)
    .then(2)
    .then(Promise.resolve(3))
    .then(console.log)
    //打印1,then里面接受的不是一个函数,就会发生值穿透问题
    
    .then(res=>{
      console.log(res)
    })
    就是.then(console.log)的简写
    
    结论:catch也会返回一个promise实例,并且是resolved状态
    Promise.resolve('hello')
      .then(res=>{
        return new Promise(resolve=>{
          var b=res + 'lagou';
          throw new Error('错误信息');
          resolve(b);
        }).catch(error=>{
        console.log('error:',error)//如果这个catch拿掉,有错就会走最下面的catch,之前的then都不走了,直接跳到catch捕获错误
        })
      }).then(res=>{
        var c = res + "I ❤ U";
        console.log(c);
      }).catch(error=>{
        console.log('error:',error)
      })
    
    
    //走到fools + await Promise时,fools是100,后面awiat是异步,进入微任务,等待console.log('s'+fools)结束,继续执行微任务 console.log('d'+fools),打印出110
    var fools =100;
    async function main(){
      fools = fools + await Promise.resolve(10);
      console.log('d'+fools)
    };
    main();
    fools++;
    console.log('s'+fools);
    

    相关文章

      网友评论

          本文标题:前端小白成长之09--Promise

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