Запрос $ .get в цикле с разными URL? - PullRequest
1 голос
/ 05 апреля 2019

Я хочу проверить текстовый файл, если он содержит этот текст, затем перейти к следующему запросу 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 голосов
/ 06 апреля 2019

Я бы реализовал это совсем по-другому.Я думаю, вы должны прочитать о fetch и promises (https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch). Это легко решит проблему такого рода!

В любом случае ... Я пытаюсь внести минимальные изменения в ваш код, чтобыработать. Вот как:

  • Удалите ваши переменные управления, так как вы можете использовать длину массива и результаты теста.
  • Используя длину массива, вы можете просто добавить больше элементов вмассив, и он будет просто работать.
  • Поскольку каждый файл требует отдельного теста, я изменяю массив строковых URL-адресов на массив объектов, где мы можем добавить метод test к каждому.
  • Переменная breakLoop была заменена возвратом метода test.
  • Тест breakLoop был заменен рекурсивным тестом.
  • Цикл while был заменен на циклАсинхронный рекурсивный метод getFiles. Это также делает testMessage асинхронным, поэтому я объявил ему callback аргумент.
  • getFiles вызывается после его объявления по индексу 0. ** Он используетajax в jQuery и по результату запускает текущий этап тестирования. ** Когда возвращается значение 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...