在赛跑时间内兑现一次承诺

Resolve a promise once in a racing time

这是一个承诺:

var getVersion = new Promise(function(resolve){ getVersionAsyn(resolve); }); 然后很多http请求依赖于那个'version'并且请求同时发送。

页面初始时,会向服务器发送大量http请求,请求依赖于'version'。

如何防止getVersion多次承诺运行?


好的。我自己投反对票。真是个白痴问题。

getVersion 的结果保存在后续承诺的执行上下文中...

getVersion.then(version => {
    var reqA = doHttp(version, "request A");
    var reqB = doHttp(version, "request B");
    var reqC = doHttp(version, "request C");
    return Promise.all([reqA, reqB, reqC]);
});

How to prevent getVersion promise run multiple times?

您已经在缓存 promise 以及版本的已解析值,因此 getVersionAsyn() 只会被调用一次。您可以在承诺中拥有任意数量的 .then() 处理程序,所有后续的一次操作只是从承诺数据结构中获取保存的、已解析的值。他们不会一遍又一遍地 "execute" 任何其他事情。

此代码的工作方式:

var getVersion = new Promise(function(resolve){
    getVersionAsyn(resolve);
});

getVersion 是一个承诺,您已经在存储它。您可以有尽可能多的来电者:

getVersion.then(function(version) {
    // access the version here
});

而且,getVersionAsyn() 只会被调用一次,第一次。从那时起,一旦 promise 已解决,您将只访问保存的已解决值(本质上是一个自动缓存)。使用 promise 进行缓存和异步检索值实际上是一个很好的设计模式。