Javascript 多次调用方法后返回相同承诺的模式

Javascript 多次调用方法后返回相同承诺的模式,javascript,promise,Javascript,Promise,假设我有一个执行异步操作的方法,并在该操作完成时返回得到解析的承诺,那么如何确保在该操作完成之前多次调用时得到相同的承诺。 操作完成后,当我调用它时,编辑它-我想获得当前操作的新承诺 一种选择是通过外部范围内的变量记住call(memoize)和eg跟踪promise var p; function test() { if (p) return p; p = new Promise(res) { res(); p = null; } retur

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

一种选择是通过外部范围内的变量记住call(memoize)和eg跟踪promise

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

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

您在这里使用的方法被称为,很难想出更好的解决方案

您可能想做的是从函数本身中分离出繁琐的部分(保存在外部范围、重用、删除)。甚至可以使用:

完整示例
“严格使用”;
const reuse-promise=require('reuse-promise')。默认值;
设i=0;
功能测试(){
返回新承诺(解决=>{
setTimeout(()=>resolve(i++),100);
});
}
const reusableTest=reuseepromise(测试);
reusableTest().then(console.log).catch(console.err);
reusableTest().then(console.log).catch(console.err);
reusableTest().then(console.log).catch(console.err);
设置超时(()=>{
reusableTest().then(console.log).catch(console.err);
reusableTest().then(console.log).catch(console.err);
reusableTest().then(console.log).catch(console.err);
}, 200);

//输出:0 0 0 1 1 1
我猜您的实际承诺没有像您的非工作示例中的承诺那样同步解决?不要忘记适当地(以任何可能的方式)处理拒绝相关问题:。是的,备忘录很适合这里-但忘记了一个要求-操作完成时重置状态,所以下次打电话给fn会给我新的承诺。。再次回忆。。这当然很容易,因为它完全被图书馆所覆盖。我在回答中添加了一个例子来说明这个问题。
import reusePromise from 'reuse-promise';

function test() {
   return new Promise(function (res) {
       res();
   });
}

const reusableTest = reusePromise(test);