16

我想要一个等到then它运行之前被调用的承诺。也就是说,如果我从未真正调用then,则承诺将永远不会运行。

这可能吗?

4

1 回答 1

13

创建一个函数,在第一次调用时创建并返回一个 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 的对象来进行惰性调用,但是生成这些 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 自己负责惰性求值。

于 2014-02-22T16:52:26.133 回答