javascript - Async-Await:即使一个错误,如何在多个等待调用中获取数据?

标签 javascript node.js express asynchronous async-await

所以我有这个async我多次调用 NodeJS 的 DNS Api 的函数.前两个调用返回数据,但由于第三个调用,catch block 触发,我没有从前两个调用中获取数据。
由于这完全取决于查询的类型(netflix.com),一些等待操作可能会因为没有数据而引发错误。但我想要的是我想从其他调用中获取数据,即使其中一些调用存在错误。
这是代码:

const dnsResolve = async () => {
    const query                 = 'netflix.com';

    try{
        const aRecord           = await dns.resolve4(query);
        const aaaaRecord        = await dns.resolve6(query);
        const cnameRecord       = await dns.resolveCname(query);
     
        console.log(aRecord);
        console.log(aaaaRecord);
        console.log(cnameRecord);
    }catch(err) {
        console.log(err);
    }
}

dnsResolve();
上面的代码返回
Error: queryCname ENODATA netflix.com
    at QueryReqWrap.onresolve [as oncomplete] (internal/dns/promises.js:167:17) {
  errno: undefined,
  code: 'ENODATA',
  syscall: 'queryCname',
  hostname: 'netflix.com'
}
前两个查询的单独输出:
aRecord: [
  { address: '51.73.1.12' },
  { address: '55.83.62.128' },
  { address: '12.12.82.118' }
]
aaaaRecord:  [
  { address: '2406:da200:ff00::222c0:598a' },
  { address: '24206:da00:ff00::22c2:44203' },
  { address: '2406:da0e0:ff00::36de2:41fd' }
]
我想如何显示数据:
[
  { address: '51.73.1.12' },
  { address: '55.83.62.128' },
  { address: '12.12.82.118' },
  { address: '2406:da200:ff00::222c0:598a' },
  { address: '24206:da00:ff00::22c2:44203' },
  { address: '2406:da0e0:ff00::36de2:41fd' },
  { NO CNAME RECORDS }
]
请注意,DNS API 将有大约 6 次调用。 .由于没有数据,无法确定哪个会触发错误。这完全取决于查询。

最佳答案

这就是用例 Promise.allSettled 是为了:

const results = await Promise.allSettled([
    dns.resolve4(query),
    dns.resolve6(query),
    dns.resolveCname(query),
]);
for (const {status, value, reason} of results) {
    if (status === "fulfilled") {
        // Promise was fulfilled, use `value`...
    } else {
        // Promise was rejected, see `reason` for why...
    }
}
或者,如果您只想要成功的结果:
const results = await Promise.allSettled([
    dns.resolve4(query),
    dns.resolve6(query),
    dns.resolveCname(query),
]);
const values = results.filter(({status}) => status === "fulfilled")
                      .map(({value}) => value);
// ...use `values`...

关于javascript - Async-Await:即使一个错误,如何在多个等待调用中获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65874211/

相关文章:

javascript - 文本输入中的 CSS 样式特定字符

javascript - 在 Javascript 中排队并停止将点击事件传播到 div 内部

javascript - 为什么向我的 jade 模板添加 CSS 链接会使我的 Node 应用程序崩溃?

node.js - 如何在express/mongoose应用程序中正确构建数据库调用?

node.js - ExpressJS、Nodester、模板渲染路径?

javascript - Node js : Express js asynchronous db query execution-return results got undefiend

node.js - 从外部url获取图片的url

javascript - dc.js 饼图图例 - 如果结果为 0 则隐藏

javascript - 将两个客户端数据保存到一个变量中?

javascript - 如何使用 PHP 与 javascript 变量交互?