为了账号安全,请及时绑定邮箱和手机立即绑定

NodeJS 异步

NodeJS 异步

慕斯709654 2022-07-21 11:00:52
我正在寻找想法/帮助来改进我的代码。它已经开始工作了,但我对它没有信心,也没有为它感到骄傲。这是我的功能的简短版本 -module.exports.serverlist = async () => {let promises = [];const serverlist = [];serverlist.push({ mon_sid: 'AAA', mon_hostname: 'aaaa.com', mon_port: 80 })serverlist.push({ mon_sid: 'BBB', mon_hostname: 'bbbb.com', mon_port: 80 })serverlist.forEach(async (Server) => {    if (Server.mon_sid.includes('_DB')) {        // Function home.checkOracleDatabase return promise, same as above functions        promises.push(home.checkOracleDatabase(Server.mon_hostname, Server.mon_port));    } else if (Server.mon_sid.includes('_HDB')) {        promises.push(home.checkHANADatabase(Server.mon_hostname, Server.mon_port));    } else {        promises.push(home.checkPort(Server.mon_port, Server.mon_hostname, 1000));    }})for (let i = 0; i < serverlist.length; i++) {    serverlist[i].status = await promises[i];}console.table(serverlist);代码做什么?: - 它异步执行所需的服务可用性检查。期望是什么?- 代码将异步运行,在函数结束时,它将等待所有承诺被解决,对于失败的结果,它将再次执行检查,并对承诺有更多的控制权。目前,promise 与系统数组并没有真正的联系,它只是基于顺序,但将来可能会出现问题。如果有人可以帮助/提供一些建议,我会非常高兴。另外我不确定NodeJS(或操作系统)可以执行多少并行异步操作。目前列表有30个系统,但未来可能是200-300个,我不确定是否可以一次处理。更新我使用了 promise.all - 它工作正常。但是,正如我所提到的,我无法控制 $promises 数组。结果在触发时保存在序列中,这就是将它们从 $promises 分配回 serverlist[i].status 数组的方式。但是我想对它有更多的控制权,我想在 $promises 数组中有一些索引,或者一些东西,这样我就可以确保将结果分配给正确的系统(幸运的是,不是按照分配的顺序来计算)正如它应该)。此外,我想通过选项扩展此功能以重新尝试失败检查,为此我肯定需要 $promises 数组中的一些索引。
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

首先,您可以映射它们并全部执行 Promise,而不是为每个和推送承诺。你不需要推动。你的函数可以直接返回你的 Promise all 调用。调用者可以等待它或使用 then... 像这样的东西(我没有测试它)


// serverlist declaration

function getList(serverlist) {

const operations = serverlist.map(Server => {

    if (Server.mon_sid.includes('_DB')) {

        return home.checkOracleDatabase(Server.mon_hostname, Server.mon_port);

    } else if (Server.mon_sid.includes('_HDB')) {

        return home.checkHANADatabase(Server.mon_hostname, Server.mon_port);

    } else {

        return home.checkPort(Server.mon_port, Server.mon_hostname, 1000);

    }

});


return Promise.all(operations)

}


const serverlist = [...]

const test = await getList(serverlist)


// test is an array of fulfilled/unfulfilled results of Promise.all


所以我会创建一个函数,它接受一个操作列表(serverList)并像上面的例子一样返回承诺,而不用等待它。调用者将等待它或使用另一个承诺来执行对您的函数的所有其他调用。潜在地,您可以像 Inception 一样深入 :)


// on the caller you can go even deeper


await Promise.all([getList([...]) , getList([...]) , getList([...]) ])



考虑到您添加的内容,您可以返回更自定义的内容,例如:


    if (Server.mon_sid.includes('_DB')) {

        return home.checkOracleDatabase(Server.mon_hostname, Server.mon_port).then(result => ({result, name: 'Oracle', index:..., date:..., hostname: Server.mon_hostname, port: Server.mon_port}))

在上述情况下,您的承诺将返回一个带有操作输出结果的 json,以及一些您可能希望重用以组织数据的附加字段。


查看完整回答
反对 回复 2022-07-21
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

为了更加一致并解决这个问题,我/我们(可以帮助您的其他人)需要所有代码,所有变量定义(因为现在我找不到promises变量定义在哪里)。谢谢



查看完整回答
反对 回复 2022-07-21
  • 2 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信