【问题标题】:Patterns for returning same promise after calling method multiple times多次调用方法后返回相同承诺的模式
【发布时间】:2016-05-09 20:50:43
【问题描述】:

鉴于我有一个方法可以执行异步操作并返回在该操作完成时得到解决的承诺 - 我如何确保在该操作完成之前多次调用时我得到相同的承诺。 编辑当我在操作完成后调用它 - 我想为当前操作获得新的承诺..

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

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

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

【问题讨论】:

标签: javascript promise


【解决方案1】:

您在这里使用的方法称为memoization,很难想出更好的方法。

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

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

【讨论】:

  • 是的,memoization 非常适合这里 - 但忘记了一个要求 - 操作完成时重置状态,所以下一次调用 fn 会给我新的承诺.. memoize 再次。 ..它当然可以轻松完成
  • 图书馆完全覆盖。我在回答中添加了一个示例来说明这种情况。
猜你喜欢
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
相关资源
最近更新 更多