【问题标题】:One single onComplete callback for the last of two functions to execute一个 onComplete 回调,用于执行两个函数中的最后一个
【发布时间】:2018-03-29 15:47:38
【问题描述】:

我有两个同时运行的函数,我希望回调在最后一个完成时只执行一次。

function gotoPage () {
  //only call this once for the last one
}
app.update(gotoPage);
geolocation.getCurrentPosition(gotoPage);

我意识到我可以嵌套它们以进行顺序执行,但出于性能原因我不希望这样做。 有没有一个巧妙的技巧可以有效地做到这一点?

【问题讨论】:

  • 为什么你不用promise来代替?
  • 我没看过 inot Promise 请你详细说明一下。

标签: javascript function asynchronous callback


【解决方案1】:

用承诺解决:

Promise.all([
    new Promise(resolve => app.update(resolve)),
    new Promise(resolve => geolocation.getCurrentPosition(resolve)),
]).then(() => gotoPage());

您可以在此处阅读 Promise:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

【讨论】:

  • 我正在为一个 Cordova 应用程序写作,目标是潜在的 ES6 之前的移动浏览器。这会如何降级?
  • 如果你在 MDN 上查找 Promise 类的参考,那么你可以看到确切的浏览器兼容性;您也可以查看caniuse.com。从 Edge 开始,AFAIK 的承诺得到了很好的支持;虽然不在 IE 中。您可以检查旧浏览器是否存在 polyfill。
  • 这似乎是最好的答案,但是我没有在问题中指定我的目标浏览器很旧,所以我实际上不能使用它。不过谢谢,很高兴知道。
【解决方案2】:

快速技巧是使用一个变量来计算完成了多少功能

var i = 0;

function gotoPage () {
   i++;

   if(i == requiredNumber) {
      // execute stuff

   } else { // some is pending }

  //only call this once for the last one
}
app.update(gotoPage);
geolocation.getCurrentPosition(gotoPage);

【讨论】:

  • 为什么要让事情变得复杂,而他可以使用承诺以一种干净的方式实现他的最终目标?
  • Promise 肯定很棒(对于那些正确理解它的人)。这只是一个让事情顺利进行的快速肮脏技巧
  • 请您举例说明如何通过 promise 实现这一点?
  • 由于目标浏览器较旧,我可能会使用与此方法类似的东西。
猜你喜欢
  • 2021-03-24
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
相关资源
最近更新 更多