2016-08-04 80 views
-1

这里曾经解决一诺千金:在赛车时

var getVersion = new Promise(function(resolve){ getVersionAsyn(resolve); }); 那么很多HTTP请求取决于“版本”,并请求在同一时间发送。

当页面初始化时,很多http请求将发送到服务器,并且请求取决于'版本'。

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


好的。我投票自己。这样的白痴问题。

+0

_“然后很多http请求依赖于'版本'并且请求在同一时间发送'_什么是'getVersionAsyn'的文本?哪个函数会产生多个HTTP请求? – guest271314

+0

将'resolve'传递给'getVersionAsyn'函数的目的是什么? – guest271314

+0

_“如何防止'getVersion'承诺多次运行?”_为什么'getVersion'被多次调用?不确定预期的结果是什么?防止发生多个请求?或者防止函数被递归调用?尽管在问题中没有出现递归? – guest271314

回答

2

如何防止getVersion答应多次运行?

您已经缓存了承诺,因此版本的解析值只能被调用一次。您可以根据承诺获得尽可能多的处理程序,而后续的所有操作只需从promise数据结构中提取保存的已分解值。他们不会一遍又一遍地“执行”其他任何事情。

此代码的工作方式:

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

getVersion是一个承诺,你已经将它存储。当你这样做,你可以有许多来电者:

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

而且,getVersionAsyn()将只被称为只有一次,第一次。从那时起,一旦承诺解决了,您将只需访问保存的解析值(本质上是一个自动缓存)。它实际上是一个很好的设计模式,它使用promise来缓存和异步检索值。

+0

'getVersion。然后(函数(版本){ //在这里访问版本 });''将'版本'可以在'.then()'''''''getVersion''返回''''''''另外,'resolve'似乎确实被调用? – guest271314

+0

@ guest271314 - 对不起,但我不明白那个评论。 'getVersion'是一个承诺。使用'.then()'将会返回无论您调用一次还是一次100次都能解决的承诺值。承诺永远不会改变他们解决的价值。 – jfriend00

+0

在Answer处调用javascript的'resolve'吗?或作为参考传递给'getVersionAsyn'?请注意,问题中的要求不明确,在这里。 – guest271314

1

保持在随后的承诺的执行上下文的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]); 
}); 
+0

但是页面初始化后的http请求怎么样?我需要解决'''getVersion'''again吗? – JamesYin

+0

按照我的建议,所有这些http请求都将访问相同的'version'结果,只运行一次,但在依赖它的任何请求之前运行。 – danh