【问题标题】:Can I do a "lazy" promise with Bluebird.js? [closed]我可以用 Bluebird.js 做一个“懒惰”的承诺吗? [关闭]
【发布时间】:2014-03-24 07:27:42
【问题描述】:

我想要一个等到then 被调用后再运行的promise。也就是说,如果我从未真正调用过then,则promise 将永远不会运行。

这可能吗?

【问题讨论】:

  • 这没有任何意义。为什么不只是有一个在你调用它时执行的函数呢?另外 - 没有人对否决票有任何解释,解释是隐含的:有人认为您的问题没有用,缺乏研究或不清楚。
  • 因为生成的承诺可能会多次调用then(在它实际解决之前或之后,这就是为什么我需要它是一个承诺而不是一个函数)。或者它可能根本不会被调用,在这种情况下我不想浪费时间执行它。
  • 这是一种不同的模式,在承诺之外。只需创建一个返回承诺的函数,但它会记住该承诺。
  • “这是一种不同的模式,在承诺之外。”很公平,我只是认为可能存在“惰性承诺”之类的东西,因为它似乎是一个常见的用例。抱歉问了。
  • 您不必为提问感到抱歉,我个人认为这个问题没有任何问题,而且我不确定为什么它会吸引反对票,只是它表明在如何处理方面存在一些误解承诺工作。我会修改我的答案。

标签: javascript promise bluebird


【解决方案1】:

创建一个函数,在第一次调用时创建并返回一个 Promise,但在每次后续调用时返回相同的 Promise:

function getResults() {
  if (getResults.results) return getResults.results;

  getResults.results = $.ajax(...); # or where ever your promise is being built

  return getResults.results;
}

Promise 无法以支持延迟加载的方式运行。 Promise 由异步代码创建,以传达结果。在调用异步代码之前,没有任何承诺

您当然可以编写一个类似 Promise 的对象来进行惰性调用,但是生成这些 Promise 的代码会非常不同:

// Accepts the promise-returning function as an argument
LazyPromise = function (fn) {
  this.promise = null;
  this.fn = fn
}

LazyPromise.prototype.then = function () {
  this.promise = this.promise || fn();
  this.promise.then.apply(this.promise, arguments)
}

// Instead of this...
var promise = fn();

// You'd use this:
var promise = new LazyPromise(fn);

在这种不常见的用法中,最好是让 Promise 的实际创建变得惰性(如上述示例中的任何一个),而不是试图让 Promise 自己负责惰性求值。

【讨论】:

猜你喜欢
  • 2016-05-12
  • 2017-05-07
  • 1970-01-01
  • 2010-11-30
  • 2017-05-03
  • 2018-08-15
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
相关资源
最近更新 更多