当列表长度未知时按顺序调用 http.get

Invoking http.get sequentially when the list length is unknown

本文关键字:顺序调用 http get 未知 列表      更新时间:2023-09-26

>假设我有以下内容:

var myurls = ['http://server1.com', 'http://server2.com', 'http:sever2.com', etc ]

每个 url 都是一个"回退",仅当无法访问前一个 url 时才应使用。换句话说,此列表指定优先级。我们还假设这个列表可以是任何长度 - 我不知道,必须迭代。

我如何编写一个函数,比如说循环遍历这个数组并返回第一个可访问服务器的"可达性"?

我不能做$http.all因为它是并行的。我无法运行内部有$http.getwhile循环,因为结果可能会稍后出现,同时,我的 UI 将冻结。

请注意,我没有使用jQuery。我正在使用ionic,它有一个jQuery-lite版本。

我看到的各种例子都在谈论将它们链接在 .then 中,如果您事先知道 URL 的 #,这很好,但我不知道。

谢谢

只需在数组上减少:

myurls.reduce((p, url) => p.catch(() => http.get(url).then(() => url)),
              Promise.reject());

福禄解释:

它基于使用reduce构建承诺链的更常见模式,如下所示:[func1, func2].reduce((p, f) => p.then(f), Promise.resolve());等价于Promise.resolve().then(func1).then(func2)reduce的最后一个参数是初始值)。

在您的情况下,由于您要在失败时重试,因此您希望构建一个重试(或拒绝)链,因此我们必须从Promise.reject()开始。 Promise.reject().catch(func1).catch(func2)

我想递归和链接可以满足您的需求:

var findFirstReachableUrl = function (urls) {
  if (urls.length > 0) {
    return $http.get(urls[0]).then(function () {
      return urls[0];
    }, function () {
      return findFirstReachableUrl(urls.slice(1));
    });
  } else {
    return $q.reject("No reachable URL");
  }
}

叫:

findFirstReachableUrl(myurls).then(function (firstReachableUrl) {
  // OK: do something with firstReachableUrl
}, function () {
  // KO: no url could be reached
});