亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號