多次调用方法后返回相同promise的模式

Patterns for returning same promise after calling method multiple times

本文关键字:promise 模式 返回 调用 方法      更新时间:2023-09-26

给定我有一个执行异步操作并返回promise的方法,该方法在操作完成时得到解析-我如何确保在操作完成前多次调用时,我得到相同的promise。编辑当我在操作完成后调用它时-我想获得当前操作的新承诺。。

一种选择是记住调用(记忆),例如通过外部范围中的变量跟踪承诺

var p;
function test() {
   if (p) return p;
   p = new Promise(res) {
       res();
       p = null;
   }
   return p;
}

还有其他更好的解决方案吗?

您在这里使用的方法被称为记忆化,很难想出更好的方法。

您可能想要做的是将乏味的部分(保存在外部范围、重用、删除)从函数本身中分离出来。或者甚至使用库:

import reusePromise from 'reuse-promise';
function test() {
   return new Promise(function (res) {
       res();
   });
}
const reusableTest = reusePromise(test);

完整示例

"use strict";
const reusePromise = require('reuse-promise').default;
let i = 0;
function test() {
  return new Promise(resolve => {
    setTimeout(() => resolve(i++), 100);
  });
}
const reusableTest = reusePromise(test);
reusableTest().then(console.log).catch(console.err);
reusableTest().then(console.log).catch(console.err);
reusableTest().then(console.log).catch(console.err);
setTimeout(() => {
  reusableTest().then(console.log).catch(console.err);
  reusableTest().then(console.log).catch(console.err);
  reusableTest().then(console.log).catch(console.err);
}, 200);
// output: 0 0 0 1 1 1