我想要一个等到then
它运行之前被调用的承诺。也就是说,如果我从未真正调用then
,则承诺将永远不会运行。
这可能吗?
创建一个函数,在第一次调用时创建并返回一个 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 自己负责惰性求值。