如何在nodejs中处理同一个get函数的多次调用?

时间:2017-09-09 13:29:03

标签: javascript node.js ajax

使用Ajax调用我每10秒调用一次下面的get函数,以便我可以监视某些URL的状态。

app.get('/getUrl', function(req, res) {
            var response = {};
            var keyArr = [];
            var urlData = [];
            var responses = [];
            var dataArr = [];
            var keyArrLength;


            //Listing All the URLS

            db.list(function(err, data) {
                keyArrLength = data.rows.length;
                dataArr = data.rows;
                console.log("keyArrLength" + keyArrLength);
                pushHost();
            });

            //Getting the key ie HOSTNAMES

            function pushHost() {
                dataArr.forEach(function(arrayItem) {
                    var host = arrayItem.key;
                    keyArr.push(host);
                    console.log("Array of hosts" + keyArr);

                });

                next(0); //Calling the main function
            }

            var urlResults = [];
            var allResponses = [];

            // Getting the Hostname and URL

            function next(index) {
                if (index === keyArrLength) { // No items left
                    res.end(JSON.stringify(allResponses));
                    return;
                } else { //Getting one URL at a time
                    db.get(keyArr[index], function(err, data) {
                        currentUrl = data.url;
                        hostname = data._id;
                        var options = {
                            url: "https://" + currentUrl,
                            strictSSL: false,
                            method: 'GET'
                        };

                        //Requesting data for that one URL

                        request(options, function(error, response, body) {

                            if (!error && response.statusCode == 200) {
                                var response = {};
                                response.body = JSON.parse(body);
                                response.hostname = hostname;
                                allResponses.push(response); //Pushing the data to final result

                            } else if (error || response.statusCode != 200) {

                                var response = {};

                                //Appending error results when it enters error handler

                                response.body = {
                                    "servicesStatus": [{
                                        "name": "name1",
                                        "active": false
                                    }, {
                                        "name": "name2",
                                        "active": false
                                    }, {
                                        "name": "name3",
                                        "active": false
                                    }],
                                }
                                response.hostname = hostname;
                                allResponses.push(response); //pushing data
                            }

                            next(index + 1); //Calling recursively till the last URL
                        });

                    });

                };

            }

        });

1)在db.list i'm getting the list of all the URL's中获取所有网址的长度或计数。

2)在推送主机功能中,我推送所有的键值,即该URL的主机名。所以,在keyArrLength has the total number of URLS and keyArr has the list of all the hostnames i.e keys

3)然后我调用next()

4)在next()中,我为每个网址发出请求,并将数据存储为form of object in an array allResponses[]

5)如果它进入错误处理程序,我将结果附加到allResponses[]

6)我通过分配

来呼叫到最后一个网址
 index=0 in the beginning and incrementing in each loop

7)当我每隔10秒调用一次此功能时,IT工作正常。

8)但是当我刷新页面时,将调用此getUrl,并且它将一直在执行,因为此调用每10秒进行一次。所以他们都碰撞了,反复重复了。

我是nodejs的新手。我不知道我是否正常运作,或者有更好的方法可以进行这些通话。

我想知道即使我刷新页面任何次数,我希望这个功能按顺序执行。如果最新的呼叫中断了前一个呼叫,我需要终止上一个呼叫并从最新呼叫开始。

非常感谢您阅读本文!请尽可能帮忙!建议你是否知道更好的方法。谢谢。

1 个答案:

答案 0 :(得分:0)

最后我发现了这个问题。上面的代码很好。问题是我没有将var添加到此hostname = data._id;,因此它存储了之前的值。那就是问题。