当列表长度未知时按顺序调用 http.get
Invoking http.get sequentially when the list length is unknown
>假设我有以下内容:
var myurls = ['http://server1.com', 'http://server2.com', 'http:sever2.com', etc ]
每个 url 都是一个"回退",仅当无法访问前一个 url 时才应使用。换句话说,此列表指定优先级。我们还假设这个列表可以是任何长度 - 我不知道,必须迭代。
我如何编写一个函数,比如说循环遍历这个数组并返回第一个可访问服务器的"可达性"?
我不能做$http.all
因为它是并行的。我无法运行内部有$http.get
的while
循环,因为结果可能会稍后出现,同时,我的 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
});
相关文章:
- 当数据库中的某些内容发生变化时调用HTTP方法Meteor.js
- AngularJs.调用$http.success中的jQuery函数
- 调用 http url 有效,但 Https 不起作用
- 如何按顺序调用延迟函数
- 使用Node中的Q promise库对值数组顺序调用/执行相同的函数;并返回带有结果的新数组/集合
- AngularJs:在内部调用$http或$resource时,让方法同步返回
- 按顺序调用javascript代码的替代方法,其间有延迟
- 对于Chrome扩展程序,从https站点调用http站点时出现错误
- 调用 HTTP get 方法以使用 angular JS 在下拉列表中填充结果
- 当列表长度未知时按顺序调用 http.get
- 调用$http以响应另一个HTTP - Angular JS
- JavaScript函数按顺序调用,由JSP进行
- 如何按顺序调用多个异步 JavaScript 函数
- 函数的 JS 顺序调用失败
- 按顺序调用 Javascript 函数
- 如何按顺序调用一堆包含 ajax 的函数
- 单个画布元素按顺序调用多个函数
- 如何在可以按各种顺序调用的函数中使用 promise
- 从https调用http时拒绝访问
- 如何调用$http在angularJS顺序?但是我需要根据第一个$http的响应调用它第二个$http