单例 Promise 和 Promise 缓存

单例 Promise

比如有一个接口请求的 Promise:

function getUserInfo() {
  return new Promise(resolve => {
    API.get('getUserInfo').then(resolve);
  })
}

单例 Promise 就是只会有一个 Promise,接口也就只会请求一次。以下我们来看一下怎么使用单例 Promise 的:

let promise = null; // 保存单例 Promise

$('.btn').click(() => {
  if (!promise) {
    promise = getUserInfo();
  }
  promise.then(data => {
    // ...
  })
})

最后的效果:连续点击按钮,但最终只会调用一次获取用户信息的接口。

为什么能这么操作,我们再来看一个简单的例子:

const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const myPromise = sleep(3000); // 这里就开始执行定时器的异步操作

console.time('first await');
await myPromise;
console.timeEnd('first await');

console.time('second await');
await myPromise;
console.timeEnd('second await');

输出:

first await: 3002ms - timer ended
second await: 0ms - timer ended

该实验表明:

  • 同一个 Promise 可以被多次等待,或使用 then
  • 等待已经 resolve 的 Promise ,将立即解决

Promise 缓存

const userPromisesCache = new Map();

const getUserById = (userId) => {
  if (!userPromisesCache.has(userId)) {
    const userPromise = request.get(`https://users-service/v1/${userId}`);
    userPromisesCache.set(userId, userPromise);
  }

  return userPromisesCache.get(userId);
};

await Promise.all([
  getUserById('user1'),
  getUserById('user1')
]);

这里,我们将 Promise 放入缓存中,然后将其返回给调用方。最终,获取用户信息接口只会调用一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值