我可以和Bluebird.js做一个“懒惰”的承诺吗?

时间:2014-02-22 16:42:51

标签: javascript promise bluebird

我想要一个等待then在运行之前被调用的承诺。也就是说,如果我从未真正致电then,那么承诺永远不会运行。

这可能吗?

1 个答案:

答案 0 :(得分: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的对象来执行惰性调用,但生成这些承诺的代码会有很大不同:

// 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);

在这种不常见的用法中,最好使实现创建的承诺变得懒惰(如上例中所示),而不是试图让承诺自己负责延迟评估。