使用promise.resolve()方法缓存数据

为什么要缓存数据?

想一下,如果我们前端在一个单页面中,很n个组件中需要同一种数据,按照常理来说,那我们需要向后台发送n条请求,那服务器很不希望请求同一条数据还要反复请求我,服务器压力也挺大,为了减小服务端的压力那我们前端就需要做一件事,既然是缓存同一条数据,我们可以把第一次请求的数据给他缓存在我们的请求函数体内部,因为函数也是一个对象,所以我们可以给函数添加一个属性来专门缓存我们的数据。接下来,我们来做一个小例子,来演示一下:

1、先用nodejs搭建一个简单的服务器

const express = require("express")
const app = express()
const cors = require("cors")
app.use(cors())
app.get("/user", (req, res) => {
    let dat = req.query
    switch (dat.name) {
      case "张三":
          res.send({
              id: 1,
              name: '张三'
          })
          break;
      case "李四":
          res.send({
              id: 2,
              name: '李四'
          })
          break;
      case "王二":
          res.send({
              id: 3,
              name: '王二'
          })
          break;
    }
})
app.listen(80, () => {
    console.log("serve run in http://127.0.0.1");
})

2、使用promise封装ajax,向后台发送数据

function Ajax(url) {
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest();
        xhr.open("GET", url, true);
        xhr.send()
        xhr.onreadystatechange = function () {
            if (xhr.status === 200) {
                resolve(JSON.parse(xhr.responseText));
            } else {
                reject("请求失败")
            }
        }
        xhr.onerror = function () {
            reject(this)
        }
    })
}

3、使用promise.resolve方法缓存请求的数据

一些步骤的说明,注释里面都写好了,主要就是运用函数也是一个对象,我们可以向其中设置一些属性,来缓存我们的数据~

function query(name) {
        // 判断query有没有cache属性,没有则给query添加一个cache属性,并设置为一个map类型
        // map类型可以让我们往里面添加数据
        let cache = query.cache || (query.cache = new Map())
        // 判断cache中是否有我们向后台请求的name,如果有我们就直接拿出来用
        if (cache.has(name)) {
            console.log("走缓存了");
            // 如果cache里面有我们的name,这里就直接使用resolve方法将我们的数据交出去
            return Promise.resolve(cache.get(name))
        }
        return Ajax(`http://localhost/user?name=${name}`).then(user => {
            console.log("没走缓存");
            // 这里就是第一次我们进行请求数据,随后成功拿到数据之后,
            // 将我们的数据存进我们设置的cache里面缓存起来
            cache.set(name, user)
            return user
        })
    }

4、调用我们的方法,输出我们的测试用例

详细的步骤说明在代码注释里~

// 第一次,我们进行请求调用,这里因为cashe里面还没有我们数据,所以,不会走缓存
 query("李四").then(user => {
     console.log(user);
 })
 // 第二次进行请求,因为我们进行缓存的操作了,就会走我们的缓存
 setTimeout(() => {
     query("李四").then(user => {
         console.log(user);
     })
 },2000)
  // 第三次进行请求,也会走我们的缓存
 setTimeout(() => {
     query("李四").then(user => {
         console.log(user);
     })
 },2000)

加定时器是为了符合我们进行后台请求数据的一个正确访问流程,如果不加定时器,可能会导致都没走缓存,原因是因为:第一请求还没完成,第二次,第三次就快速请求后台了,在第一次请求还没完成请求数据,还没进行缓存的操作,后面的就发送请求数据回来了。
输出我们测试数据

没走缓存   {id: 2, name: '李四'}
走缓存了   {id: 2, name: '李四'}
走缓存了   {id: 2, name: '李四'}

5、总结

这个方法其实是promise的一个简写形式,可以方便我们使用promise进行我们的一个数据缓存的效果,减少了向后台请求的次数,减轻了服务器的压力,可能写的有不太好的地方,谢谢大家给我提出来哦~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个使用MongoDB缓存用户数据的示例: 1. 首先,安装MongoDB,并启动MongoDB服务。 2. 在你的应用程序中,使用MongoDB的官方驱动程序或第三方驱动程序连接MongoDB。 3. 创建一个名为“users”的集合,用于存储用户数据。 ```javascript const MongoClient = require('mongodb').MongoClient; const uri = "mongodb://localhost:27017/myapp"; const client = new MongoClient(uri, { useNewUrlParser: true }); client.connect(err => { const collection = client.db("myapp").collection("users"); }); ``` 4. 当用户登录时,从MongoDB中获取用户数据。如果缓存中没有用户数据,则从数据库中查询并将其存储在缓存中。 ```javascript function getUserData(userId) { return new Promise((resolve, reject) => { // 先从缓存中获取用户数据 cache.get(userId, (err, result) => { if (err) { reject(err); } else if (result) { resolve(result); } else { // 如果缓存中没有用户数据,则从数据库中获取 collection.findOne({ userId: userId }, (err, result) => { if (err) { reject(err); } else { // 将用户数据存储在缓存中 cache.set(userId, result, (err, result) => { if (err) { reject(err); } else { resolve(result); } }); } }); } }); }); } ``` 5. 当用户更新其个人资料时,将更新后的数据存储在MongoDB中,并从缓存中删除旧的用户数据。 ```javascript function updateUserData(userId, data) { return new Promise((resolve, reject) => { // 更新数据库中的用户数据 collection.updateOne({ userId: userId }, { $set: data }, (err, result) => { if (err) { reject(err); } else { // 从缓存中删除旧的用户数据 cache.del(userId, (err, result) => { if (err) { reject(err); } else { resolve(result); } }); } }); }); } ``` 这是一个简单的示例,你可以根据你的应用程序需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值