zoukankan      html  css  js  c++  java
  • vue中promise的理解及使用(二十一待使用时更新理解)

    前言

    理解并使用promise。

    一、原理及作用

    1. promise是一种异步解决方案。

    • 由于ajax异步方式请求数据时,我们不能知道数据具体回来的事件,所以过去只能将一个callback函数传递给ajax封装的方法,当ajax异步请求完成时,执行callback函数。
    • promise对象接受resolve和reject两个参数,当一个异步动作发生时,promise对象会通过resolve完成对动作成功进行解析,reject会捕获这个动作的异常。一个promise对象,通过new Promise().then()执行下一步骤操作。
    • axios is a promise based HTTP client for the browser and node.js。也就是说,使用axios发出请求,难免涉及promise

    Promise构造函数的参数是一个函数,函数里面的代码是异步的,即Promise里面的操作,和Promise()外面的操作时异步"同时"进行的。Promise中的函数的第一个参数是回调函数,resolve用来触发then里面的代码,第二个参数是回调函数,reject用来触发catch中的代码,throw new Error();也可以触发catch,

    • resolve和reject是两个回调函数,调用resolve会触发then,reject会触发catch
    <script>
    new Promise((resolve, reject) =>{
        setTimeout(() =>{
            //成功的时候调用resolve
            resolve('成功data')
            //失败的时候调用reject
            reject('error message')
        }, 1000)
    }).then((data) =>{
        //处理成功后的逻辑
        console.log(data);//这个data 是接收的resolve参数--
    }).catch((err) =>{
        console.log(err);
    })
    </script> 
     
    • 在一个promise链中,只要任何一个promise被reject,promise链就被破坏了,reject之后的promise都不会再执行,而是直接调用.catch方法。
    p1().then(p2).then(p3)
      .then(function(data) {
        console.log('data: ' + data);
      })
      .catch(function(error) {
        console.log('error: ' + error);
      });
      
    function p1() {
      return new Promise(function(resolve, reject) {
        console.log('p1 resolved');
        resolve(123);
      });
    }
      
    function p2() {
      return new Promise(function(resolve, reject) {
        console.log('p2 rejected');
        reject(456);
      });
    }
      
    function p3() {
      return new Promise(function(resolve, reject) {
        console.log('p3 resolved');
        resolve(789);
      });
    }// 执行结果p1 resolvedp2 rejectederror: 456

    2. async await

    Promise构造函数的参数是一个函数,函数里面的代码是异步的,即Promise里面的操作,和Promise()外面的操作时异步"同时"进行的。此外,只要在函数前面加上async 关键字,也可以指明函数是异步的。

    async关键字实际是通过Promise实现,如果async 函数中有返回一个值 ,当调用该函数时,内部会调用Promise.solve() 方法把它转化成一个promise 对象作为返回,但如果timeout 函数内部抛出错误,那么就会调用Promise.reject() 返回一个promise 对象。若某函数调用一个异步函数(比如内部含有primise),该函数应用async修饰。

    await表示“等待”,修饰返回promise 对象的表达式。注意await 关键字只能放到async 函数里面。

    复制代码
    function doubleAfter2seconds(num) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(2 * num)
            }, 2000);
        } )
    }
    //写一个async 函数,从而可以使用await 关键字, await 后面放置的就是返回promise对象的一个表达式,所以它后面可以写上 doubleAfter2seconds 函数的调用
    async function testResult() {
        let result = await doubleAfter2seconds(30);
        console.log(result);
    }
    复制代码

    await 等待后面的promise对象执行完毕,然后拿到promise resolve 的值并进行返回。显然await可以修饰axios请求,等待得到结果再往下进行,如:

    async getUserList(){
                const {data: res} = await this.$http.get('users', {
                    params: this.queryInfo
                })
                //console.log(res)
                if (res.meta.status !== 200) return this.$message.error('获取用户列表失败! ')
                this.userlist = res.data.users
                this.total = res.data.total
            }

    参看链接:https://www.cnblogs.com/kongrui/p/13299410.html

    二、使用

    2.1权限校验

    监控项目中的权限校验。

    自己用到时候再研究吧,现在还没有自己写过。

    let realRoutes = [];
    export function doLogin(obj) {
        return new Promise((resolve, reject) => {
            const res = mockData.data;
            realRoutes = mockData.data.menuList || []; // 路由
            localStorage.removeItem("menuList");
            localStorage.setItem("menuList", JSON.stringify(mockData.data.menuList));
            res.msg = "success";
            if (res.msg === "success") {
                resolve(res);
            } else {
                reject(new Error("登录失败"));
            }
        });
    }
    View Code
    如果错过太阳时你流了泪,那你也要错过群星了。
    在所有的矛盾中,要优先解决主要矛盾,其他矛盾也就迎刃而解。
    不要做个笨蛋,为失去的郁郁寡欢,聪明的人,已经找到了解决问题的办法,或正在寻找。
  • 相关阅读:
    JS调试工具
    什么是Web Service?
    win7怎么安装消息队列 MSMQ
    死锁产生的原因及四个必要条件
    项目管理模式之如何去除SVN标记
    AJAX中的请求方式以及同步异步的区别
    敏捷软件开发模型--SCRUM
    堆和栈
    UI产品设计流程中的14个要点
    Android中dp和px之间进行转换
  • 原文地址:https://www.cnblogs.com/szrs/p/15229026.html
Copyright © 2011-2022 走看看