我有一个要获取的网址列表。所有这些url返回一个带有属性的json对象valid
。但是,只有在获取承诺的一个具有神奇的valid
属性true
。
我尝试了url.forEach(...)
和的各种组合Promises.all([urls]).then(...)
。目前,我的设置是:
const urls = [
'https://testurl.com',
'https://anotherurl.com',
'https://athirdurl.com' // This is the valid one
];
export function validate(key) {
var result;
urls.forEach(function (url) {
result = fetch(`${url}/${key}/validate`)
.then((response) => response.json())
.then((json) => {
if (json.license.valid) {
return json;
} else {
Promise.reject(json);
}
});
});
return result;
}
由于异步承诺,上述方法不起作用。当第一个valid == true
被点击时,我该如何迭代我的网址并返回?
让我把一个不错的紧凑型词条混入
它使用Promise.all,但是每个内部Promise都会捕获任何错误并false
在这种情况下简单地解决,因此Promise.all将永远不会拒绝-任何已完成但没有license.valid的提取都将解析为false
进一步处理数组Promise.all resolves,过滤出false
值,然后返回第一个(从问题描述中应该是唯一的)有效JSON响应
const urls = [
'https://testurl.com',
'https://anotherurl.com',
'https://athirdurl.com' // This is the valid one
];
export function validate(key) {
return Promise.all(urls.map(url =>
fetch(`${url}/${key}/validate`)
.then(response => response.json())
.then(json => json.license && json.license.valid && json)
.catch(error => false)
))
.then(results => results.filter(result => !!result)[0] || Promise.reject('no matches found'));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句