为什么 Javascript 即使在数组在 pop() 中完成后仍继续 运行

Why Javascript keep on running even after array finished in pop()

我正在尝试使用 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();

})();

有什么解决问题的建议吗?谢谢。

rec为空时不启动下一个计时器。

if (rec.length > 0) {
    setTimeout(function(){
        generateCard(rec.pop());
    }, 750);
}

在调用setTimeout 中的generateCard 方法之前添加检查。
当前,在数组为空后使用 undefined 值调用此方法。

setTimeout(function() {
  if (rec.length > 0) {
    generateCard(rec.pop());
  }
}, 1500);

您可以在每个数组项的函数中使用 reducer method 和您的代码。这样当你完成数组的最后一项时执行停止。

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

yourArray.reduce(reducer);