$ .get请求与不同的URL循环吗?

时间:2019-04-05 16:40:31

标签: javascript jquery ajax

我要检查一个文本文件(如果其中包含该文本),然后转到下一个get请求并检查另一个文本文件,以查看第二个文本文件是否包含某些文本。

我尝试过将其放入while循环中:

    function testMessage()
    {
        const filePaths =
        [
            "http://example.com/trigger.txt",
            "http://example.com/userexceptions.txt",
            "http://example.com/message.txt"
        ];

        const trigger = "true";
        var currentStage = 0;
        const finalStage = 2;
        var breakLoop = false;

        while (currentStage < finalStage)
        {
            $.get(filePaths[currentStage], function(data)
            {
                if (currentStage == 0)
                {
                    const compareText = data.localeCompare(trigger, "en", {sensitivity: "base"});
                    if (compareText == 0) //if the first text file contains the trigger "true", continue
                    {
                        someGlobalVariable = true;
                        currentStage++;
                    } else {
                        breakLoop = true;
                    }
                } else if  (currentStage == 1) //if the second text file contains the username of the current user, break the loop
                {
                    const rawUsers = data;
                    const userExceptions = rawUsers.split(';');

                    if (userExceptions.indexOf(currentUser) > -1)
                    {
                        console.log("User exception is: " + userExceptions[userExceptions.indexOf(currentUser)]);
                        breakLoop = true;
                    } else {
                        currentStage++;
                    }
                } else if (currentStage == 2)
                {
                    globalNotification = data;
                    notification.global(globalNotification);
                    console.log("Global notification displayed.");              
                } else {
                    console.log("We're here now.");
                }
            }, 'text')
            .fail(function()
            {
                console.log("Global notifications failed at stage: " + currentStage);
            });

            if (breakLoop)
                break;
        }
    }

我也尝试使用switch语句代替多个if-else语句,并且导致页面中断,因此我认为它没有正确地退出switch和循环。

运行此命令时,似乎循环永远不会结束,因此会中断页面​​?

1 个答案:

答案 0 :(得分:0)

我将以非常不同的方式实现这一目标。我认为您应该阅读fetchpromiseshttps://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)。这样可以轻松解决此类问题!

无论如何...我试图对您的代码进行最小的改动以使其正常工作。方法如下:

  • 删除控制变量,因为您可以使用数组长度和测试结果。
  • 使用数组长度,您可以简单地将更多项目添加到数组中,这样就可以正常工作。
  • 由于每个文件都需要进行不同的测试,因此我将字符串URL数组更改为对象数组,在其中可以为每个对象添加一个test方法。
  • breakLoop var被test方法return代替。
  • breakLoop测试替换为递归测试。
  • while循环被异步递归getFiles方法所代替。这也使testMessage也异步,所以我给它添加了一个callback参数。
  • getFiles在索引0声明后被调用。 **它使用jQuery的ajax,并在结果上运行当前阶段测试。 **当返回true而不是最后一项时,它将调用getFiles进入下一阶段。 **所以...这意味着它不是并行的。 (我相信)它是顺序的。
    function testMessage(callback)
    {
        const trigger = "true";
        const files =
        [
            {
                url: "http://example.com/trigger.txt",
                test(data) {
                    const compareText = data.localeCompare(trigger, "en", {sensitivity: "base"});
                    if (compareText == 0) //if the first text file contains the trigger "true", continue
                    {
                        someGlobalVariable = true;
                        return true;
                    }
                    else return false;
                }
            },
            {
                url: "http://example.com/userexceptions.txt",
                test(data) {
                    const rawUsers = data;
                    const userExceptions = rawUsers.split(';');

                    if (userExceptions.indexOf(currentUser) > -1)
                    {
                        console.log("User exception is: " + userExceptions[userExceptions.indexOf(currentUser)]);
                        return false;
                    }
                    return true;
                }
            },
            {
                url: "http://example.com/message.txt",
                test(data) {
                    globalNotification = data;
                    notification.global(globalNotification);
                    console.log("Global notification displayed.");
                    return true;
                }
            }
        ];

        (function getFiles(currentStage)
        {
            $.get(files[currentStage].url, function(data)
            {
                if (files[currentStage].test(data))
                {
                    if (files.length > currentStage+1) getFiles(currentStage+1)
                    else callback(null, "Success!")
                }
                else callback(Error(`Stage${currentStage}'s test fail.`, null))
            }, 'text')
            .fail(function()
            {
                console.log("Global notifications failed at stage: " + currentStage);
            });
        })(0);
    }
    testMessage(console.log)