我想要一个等到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;
}
承诺不能以支持延迟加载的方式工作.由异步代码创建承诺以传达结果.在异步代码被调用之前,根本没有承诺.
您当然可以编写一个类似于惰性的对象,并进行延迟调用,但是生成这些承诺的代码将大不相同:
// 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);
最好使用这种不常用的方法来使承诺的实际创建变得懒惰(如上述示例所示),而不是尝试使承诺自己负责延迟评估.