Почему Javascript продолжает работать даже после завершения массива в pop () - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь автоматизировать некоторые нажатия кнопок и вставку данных на веб-страницу с помощью TamperMonkey. Однако даже после того, как все данные из массива были вставлены, javascript продолжает нажимать на кнопку. Как установить так, чтобы после завершения вставки данных из массива javascript прекратил работу. Вот код, чтобы автоматизировать пакетный ввод подарочных карт в shopify.

// ==UserScript==
// @name         Shopify Gift Card Generator
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Generate Gift Cards from a list
// @author       You
// @grant    GM.getValue
// @grant    GM.setValue
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
// @match        https://[myshopname].myshopify.com/admin/gift_cards
// @run-at      document-idle

// ==/UserScript==

/* globals $ */

(function() {
    'use strict';

    //add recipient list
    var rec = ["2920469463099",
                 "2920466415675",
            ];

    function generateCard(code){

        if($('button:contains("Issue gift card")') !== "undefined"){

            //click generate gift card
            $('button:contains("Issue gift card")').click();

            //set recipient based on id
            $('#gift_card_customer_id').attr("value", code);

            //select the dollar amount eq(0) = 10, eq(1) = 25, eq(2) = 50, eq(3) = 100
            $('.segmented-control.large li:eq(2) label')[0].click();

            //submit!
            //$('form.new_gift_card')[0].submit();
            $('input[type=submit]').click();

            var success = false;
            function closeWindow(){

                if($('.gift-card-success-heading h2:contains("RM50.00 MYR gift card successfully issued")').length == 1){
                    if ($('#gift-card-issue-errors:contains("There ")').length == 0) {
                        //close the modal and restart!
                        $('a.close-modal').click();
                        console.log('last successful recipient id: ');
                        console.log(GM.getValue('last'));

                        setTimeout(function(){
                            generateCard(rec.pop());
                        }, 750);

                    } else {

                        console.log('generation error. last code:');
                        console.log(GM.getValue('last'));
                        success = false;
                    }
                } else {

                    setTimeout(function(){ closeWindow(); }, 500);
                }
            }

            closeWindow();
            return success;

        } else {
            generateCard(code);
        }
    }

    function begin(){

        //wait for the page to load / not over-request the shopify server
        setTimeout(function(){
            generateCard(rec.pop());


        }, 1500);

    }

    begin();

})();

Есть предложения, как решить проблему? Спасибо.

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Добавьте проверку перед вызовом метода generateCard в setTimeout.
В настоящее время этот метод вызывается со значением undefined после того, как массив пуст.

setTimeout(function() {
  if (rec.length > 0) {
    generateCard(rec.pop());
  }
}, 1500);
1 голос
/ 25 февраля 2020

Не запускать следующий таймер, когда rec пусто.

if (rec.length > 0) {
    setTimeout(function(){
        generateCard(rec.pop());
    }, 750);
}
0 голосов
/ 25 февраля 2020

Вы можете использовать метод редуктора с вашим кодом внутри функции для каждого элемента массива. Таким образом, когда вы завершаете sh, последний элемент массива останавливается.

let yourArray = [...yourData];
const reducer = (accumulator, currentValue) => {
    //your button clicking logic here
};

yourArray.reduce(reducer);
...