账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于 javascript 异步获取返回数据的问题
    45
    0

    开发的时候需要根据用户 id 获取用户名,我的设想是将用户列表存在 sessionStorage 里面,
    然后写一个公共方法,传入 id 即可获得用户名。若是发现 sessionStorage 里面没存,则发送
    axios 请求获取列表,存在 sessionStorage 里面,再根据 id 获取用户名

    因为是异步的,所以想用 async/await 获得。

    Tools.js 中的公共方法代码如下
    getUserName: function (userId) {  // 根据 userId 获取 用户名 (用户登录名和中文名)
          return new Promise(resolve => {
            if (sessionStorage.getItem('octet_user_list')) {
            let user_list = JSON.parse(sessionStorage.getItem('octet_user_list'));
            let select_user = user_list.filter(option => { return option.core_user_id == userId})[0] || {};
            resolve({user_name: select_user.core_user_name, display_name: select_user.display_name});
          } else {
            Tools.axios('/core/CoreUserController/getUserList/leqeeaa',{}).then(response => {
              let user_list = response.data.data;
              sessionStorage.setItem('octet_user_list', JSON.stringify(user_list));
              let select_user = user_list.filter(option => { return option.core_user_id == userId})[0] || {};
              resolve({user_name: select_user.core_user_name, display_name: select_user.display_name});
            })
          }
       })
    }
    然后调用公共方法
    methods: {
        async getUserName (id) {
          let user_obj = await Tools.getUserName(id);
          return user_obj.display_name + '('+ user_obj.user_name+ ')'
        }
    }
    
    视图中显示
    <span>{{ getUserName(a.user_id) }}</span>

    但是 async 函数返回的是 promise 对象,所以在视图中调用 async 方法并不能返回我想要的值。但是我又不想在 data 里面建一个字段来保存 user_obj, 所以想问问有没有好的解决方案解决这个问题。

    备用方案

    在登陆后直接请求到所有用户数据,然后用 localStorage 存,这样在界面中就不用再通过请求获取,没有了异步的烦恼。
    但是这样就有问题,当新增用户之后 localStorage 并不会更新,你要重新登陆一下获取用户列表。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 振兴 普通会员 1楼

      在JavaScript中,我们可以使用Promise或者async/await来处理异步获取数据的问题。以下是一个使用Promise的例子:

      ```javascript function fetchData(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = function() { if (xhr.status === 200) { resolve(xhr.responseText); } else { reject(xhr.statusText); } }; xhr.onerror = function() { reject(xhr.statusText); }; xhr.send(); }); }

      fetchData('https://example.com/data') .then(response => response.text()) .then(data => console.log(data)); ```

      在这个例子中,我们创建了一个新的Promise,它在异步加载数据后被解析。我们使用XMLHttpRequest对象来发送GET请求,当请求成功时,Promise会被解析,返回服务器返回的数据。如果请求失败,Promise会被拒绝。

      另一个例子是使用async/await:

      ```javascript async function fetchData(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = function() { if (xhr.status === 200) { resolve(xhr.responseText); } else { reject(xhr.statusText); } }; xhr.onerror = function() { reject(xhr.statusText); }; xhr.send(); }); }

      async function main() { try { const response = await fetchData('https://example.com/data'); console.log(response); } catch (error) { console.error(error); } }

      main(); ```

      在这个例子中,我们使用async函数来创建一个异步函数,它使用await关键字来等待Promise解析。当请求成功时,Promise会被解析,返回服务器返回的数据。如果请求失败,Promise会被拒绝。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部