【问题标题】:Resolve a promise once in a racing time在比赛中兑现一次承诺
【发布时间】:2016-08-04 12:46:12
【问题描述】:

这是一个承诺:

var getVersion = new Promise(function(resolve){ getVersionAsyn(resolve); }); 那么很多http请求都依赖于那个“版本”并且请求同时发送。

页面初始时,会向服务器发送大量http请求,请求取决于“版本”。

如何防止getVersion promise 多次运行?


好的。我自己投反对票。这么白痴的问题。

【问题讨论】:

  • "那么很多http请求依赖于那个'版本'并且请求同时发送" getVersionAsyn的文本是什么?哪个函数发出多个HTTP 请求?
  • resolve 传递给getVersionAsyn 函数的目的是什么?
  • "如何防止getVersion promise 运行多次?" 为什么getVersion 会被多次调用?不确定预期的结果是什么?防止发生多个请求?或者防止函数被递归调用?虽然没有出现递归问题?
  • getVersionAsyn是一个异步函数,所以参数“resove”是一种“回调”。 getVersionAsyn每次http请求都需要版本时会运行多次。
  • "所以参数 'resove' 是一种 'callback'" 你所说的“sort of 'callback'”是什么意思? resolve 是否在 getVersionAsyn 函数中调用?如何多次调用getVersionPromise 最多可以完成或拒绝一次。

标签: javascript asynchronous promise es6-promise


【解决方案1】:

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

你已经缓存了 promise 和版本的解析值,所以 getVersionAsyn() 只会被调用一次。你可以在一个 Promise 上拥有任意数量的 .then() 处理程序,所有后续操作只是从 Promise 数据结构中获取保存的、已解析的值。他们不会一遍又一遍地“执行”其他任何事情。

这段代码的工作方式:

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

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

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

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

【讨论】:

  • getVersion.then(function(version) { // access the version here }); version 是否可以在.then() 访问,其中return 没有来自getVersion 的值?另外,resolve 似乎确实被调用了?
  • @guest271314 - 抱歉,我不明白那个评论。 getVersion 是一个承诺。在其上使用.then() 将返回该承诺的已解决值,无论您调用它一次还是100 次。 Promise 永远不会改变它们的解析值。
  • resolve 是否在 javascript 上被调用?还是作为对getVersionAsyn 的引用传递?请注意,这里的问题要求不清楚。
  • @guest271314 - resolve 作为函数引用传递给getVersionAsyn()。我已经要求 OP 为我们提供 getVersionAsyn() 的代码,以便我们可以看到它的作用。
  • @JamesYin 预期的结果是什么?注意,ajaxjsfiddle.net/w32u9x48 上的Promise 函数实际上并未被解析或拒绝,resolve() 未被调用。
【解决方案2】:

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

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]);
});

【讨论】:

  • 但是页面初始化后的http请求呢?我需要再次解析getVersion吗?
  • 按照我建议的方式形成,所有这些 http 请求都可以访问相同的 version 结果,只运行一次,但在任何依赖它的请求之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
相关资源
最近更新 更多