How to run the same promises one after another NodeJs

I am trying to solve the following problem. Consider the following case. I need to check if an array of servers is alive. Or, to be more specific, I need to find the first working server from the list provided, I need to do this one by one.

For example, if the first server is down, check the other and the other ...

Since NodeJS is asynchronous, I cannot do this in a for loop. So I tried to implement something similar to recursion, it looks ugly and doesn't work, but I tried)

 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);
        }
    });
}

      

Please help to get the desired result, maybe it is possible to run queries synchronously.

+3


source to share


1 answer


Can be done with 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)
})()
    
      

Run codeHide result


+1


source







All Articles