我想要一个等待then
在运行之前被调用的承诺。也就是说,如果我从未真正致电then
,那么承诺永远不会运行。
这可能吗?
答案 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);
在这种不常见的用法中,最好使实现创建的承诺变得懒惰(如上例中所示),而不是试图让承诺自己负责延迟评估。