zoukankan      html  css  js  c++  java
  • 彻底学会promise使用

    一、使用promise的原因

    • 1、回调地狱

    • 2、异步同步事件调用顺序

      • js单线程 当遇到异步操作时 会放入任务栈中 等主线程执行完毕后 在调用
      • 因此在一些面试题中有要求将异步事件 实现同步顺序执行
      • 下面给一个简单的例题
    1 //实现同步操作函数【对time()函数进行实现停顿多长时间n参数传入 实现能够同步执行】
    2 console(1);
    3 await time(3);
    4 console(1);
    1. 要用到setTimeout异步函数,会在异步任务栈中等待 等主线程执行完后在执行
    2. 首先从关键词await中发现 定是异步函数 且函数要用async开头
    async function time(n){
        return new Promise(function(resolve, reject) {
            setTimeout(() => {
                resolve();
            }, n);
        })
    }

     二、promise的使用方法

    1、简单示例

    //方法一   【.then()和.catch()分别代表成功与失败回调】
    new Promise(function (resolve, reject) {
        setTimeout(() => {
           resolve();//成功执行
           //reject(); 失败执行 一般两者用if与else区分
        }, n);
    })
    .then(res=>{
       //执行成功的回调即上方resolve() 
    })
    .catch(err=>{
       //执行成功的回调即上方reject() 
    })
    
    
    //方法二    【在.then中 两参数前为成功回调 后为失败回调】
    new Promise(function (resolve, reject) {
        setTimeout(() => {
           resolve();//成功执行
           //reject(); 失败执行 一般两者用if与else区分
        }, n);
    })
    .then(res=>{
            //成功回调
    },err=>{
            //失败回调
    })

    2、链式调用

    • 第一种方式(不推荐)【利用每次回调函数中都return一个promise对象 执行.then函数】
    new Promise(function (resolve, reject) {
        setTimeout(() => {
           resolve();//成功执行
        }, 1000);
    })
    .then(res=>{
         return new Promise(function (resolve, reject) {
            setTimeout(() => {
               resolve();//成功执行
            }, 1000);
        })
    })
    .then(res=>{
         return new Promise(function (resolve, reject) {
            setTimeout(() => {
               resolve();//成功执行
            }, 1000);
        })
    })
    •  第二种方式 适合直接返回数据  【两种方法 Promise.resolve()与直接return 等价

                       【两种方法 Promise.reject()与直接throw等价】

    //Promise.resolve()方法
    new Promise(function (resolve, reject) {
        setTimeout(() => {
           resolve("res1");//成功执行
        }, 1000);
    }).then(res=>{
       console.log("第一次回调结果",res)
       return Promise.resolve(res+" res2")
    }).then(res=>{
       console.log("第二次回调结果",res)
       return Promise.resolve(res+" res3")
    }).then(res=>{
       console.log("第三次回调结果",res)
    })
    
    //直接return字串方法
    new Promise(function (resolve, reject) {
        setTimeout(() => {
           resolve("res1");//成功执行
        }, 1000);
    }).then(res=>{
       console.log("第一次回调结果",res)
       return res+" res2"
    }).then(res=>{
       console.log("第二次回调结果",res)
       return res+" res3"
    }).then(res=>{
       console.log("第三次回调结果",res)
    })

        执行结果

    3、promise的all方法

       类似于axios的all方法 【Promise.all([p1, p2])传入数组对象由promise对象组成

    const p1 = new Promise((resolve, reject) => {
            resolve('hello');
        }).then(result => result);
    const p2 = new Promise((resolve, reject) => {
            throw new Error('报错了');
        }).then(result => result);
    Promise.all([p1, p2])
        .then(result => console.log(result))
        .catch(e => console.log(e));
  • 相关阅读:
    js函数的属性和方法
    php中str_repeat函数
    html5中的空格符
    php实现简单算法3
    php intval函数
    什么是全栈工程师
    配置Log4j(非常具体)
    【解决】/usr/bin/ld: cannot find -lc
    Java的位运算符具体解释实例——与(&)、非(~)、或(|)、异或(^)
    【小白的java成长系列】——顶级类Object源代码分析
  • 原文地址:https://www.cnblogs.com/cc123nice/p/12601416.html
Copyright © 2011-2022 走看看