• 彻底学会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));
  • 相关阅读:
    Flutter Icons 内置图标库,全套Material图标
    解决cannot connect to daemon at tcp:5037: cannot connect to 127.0.0.1:5037: 由于目标计算机积极拒绝,无法连接。 (10061).
    mavenCentral()、jcenter()、google()仓库
    flutter doctor检查出现多个Android Studio解决办法
    Oracle trunc 函数用法详解
    将博客搬至CSDN
    Yii2 高级模板不使用Apache配置目录,将前后台入口移到根目录
    报警告session_regenerate_id(): Failed to create(read) session ID: files (path: N;/path)
    yii2GridView的简单使用
    yii 表单如何写,action指向哪里?
  • 原文地址:https://www.cnblogs.com/cc123nice/p/12601416.html
Copyright © 2020-2023  润新知