node.js - 如何一个接一个地运行相同的 promise NodeJs

标签 node.js ecmascript-6 promise request es6-promise

我正在尝试解决以下问题。 考虑以下情况。我需要检查一组服务器是否还活着。或者更具体地说,我需要从提供的列表中找到第一个工作服务器,我需要一个一个地执行此操作。

例如,如果第一个服务器不工作,检查另一个和另一个......

就 NodeJS 是异步的而言,我不能在 for 循环中执行此操作。所以我尝试实现类似于递归的东西,它看起来很丑而且不起作用,但我已经尝试过)

 static findWorkingServer(servers, payload) {
        return NetworkUtils.getMyPublicIP()
            .then((ip) => {
                return new Promise(function (resolve, reject) {
                    let currentIndex = -1;
                    if (servers.length > 0) {
                        let currentServer;
                        let serverCheckCallback = function (result) {
                            if (result) {
                                resolve({working: currentServer, payload: payload});
                            }
                            else {
                                if (currentIndex < servers.length-1) {
                                    currentIndex++;
                                    currentServer = servers[currentIndex];
                                    NetworkUtils.checkIfServerWorking(currentServer, ip)
                                        .then(serverCheckCallback);
                                }
                                else {
                                    reject(new Error("No working servers found"))
                                }
                            }
                        };
                        serverCheckCallback(false);
                    }
                    else {
                        resolve(new Error("No servers provided"));
                    }
                })
            });
    }
static checkIfServerWorking(credentials, publicIp) {
    return new Promise(function (resolve, reject) {
        if(credentials) {
            request({
                url: credentials.url,

                agentClass: agentClass,
                agentOptions: {
                   // Agent credentials
                }
            })
                .then(res => {
                     // Do some stuff with resposne
                    resolve(someCondition);
                })
                .catch(err => {
                    resolve(false);
                });
        }else {
            resolve(false);
        }
    });
}

请帮助获得所需的结果,也许可以同步运行请求。

最佳答案

可以用 await/async 完成:

let servers = ["test0.com","test1.com","test2.com","test3.com","test4.com"]

class ServerTest {
    static async checkServer(name) {
        if (name === "test3.com") 
            return true //returns promise that resolves with true
        else
            return false //returns promise that resolves with false
    }
}

(async()=>{ //IIFE (await can only be used in async functions)
    let targetServer
    for (i in servers) {
        if (await ServerTest.checkServer(servers[i]) === true) {
            targetServer = servers[i]
            break
        }
    }
    console.log("Found a working server: " + targetServer)
})()
    

关于node.js - 如何一个接一个地运行相同的 promise NodeJs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44675178/

相关文章:

node.js - Passport 中的用户权限级别

sql - 有什么方法可以使用 LISTEN 和 NOTIFY(或 NodeJS)实时监控 Postgresql 查询更改?

javascript - 将导入的函数与 eval 一起使用

javascript - 如何更改 requestAnimationFrame() 函数以使用 Promise?

javascript - Mongodb 查找不返回数组

javascript - React 在 props 改变时取消 Promise

javascript - 如何检查对象数组是否包含 Node 中的特定对象

node.js - 使用 Mongoose 的抽象类

javascript - 如何在 react 导航中定位后退箭头按钮

javascript - 为什么在此示例中使用生成器函数比填充和迭代数组慢?