代码之家  ›  专栏  ›  技术社区  ›  Lukas Strobel

是什么导致我的jquery调用出现这种递归?

  •  0
  • Lukas Strobel  · 技术社区  · 5 年前

    我目前已经编写了一些代码,这些代码将在自定义后调用函数 .trigger() 打电话。这就是所谓的:

    function _visitAddTag(state, listener) {
            if (state.properties.action = "RedoAddTag") contextMenu.unhide();
            var $target = contextMenu.getContextMenuUI().tags; // Grab tag elements
            var callback = function () {
                if (listener) {
                    google.maps.event.removeListener(listener);
                }
                $target.off("tagIds-updated", callback);
                contextMenu.hide();
                next.call(contextMenu.getTargetLabel(), state.transition);
            };
            $target.on("tagIds-updated", callback());
        }
    

    这个 next.call() 行导致触发此方法:

    function () { // 'this' is contextMenu.getTargetLabel(), as called in Onboarding.js/_visitAddTag()
                    tracker.push('Onboarding_Transition', {onboardingTransition: "tag-attribute-1"});
                    var tags = this.getProperty('tagIds');
                    return tags == [2] ? "adjust-heading-angle-1" : "redo-tag-attribute-1" // Where 2 is the tag_id of the "points into traffic" tag
                }
    

    其中返回值为 "redo-tag-attribute-1" 会导致整个事情再次循环。

    我在这里看到了递归的可能性,特别是如果 "tagIds-updated" 事件以某种方式在第二个函数调用内部触发。但是,当我调试代码时,该事件只触发一次。有人知道这里发生了什么吗?我是一个javascript新手,所以可能我错过了一些明显的东西。

    1 回复  |  直到 5 年前
        1
  •  1
  •   maazadeeb    5 年前

    我无法完全理解代码。目前我在您的代码中看到两个问题:

    1. $target.on("tagIds-updated", callback()); 没有真正附加事件处理程序。只是打电话而已 callback 立即。你需要 $target.on("tagIds-updated", callback); . 注意失踪的人 () .
    2. tags == [2] 将永远 false . Why? . 你可能会用 tags.includes(2) 相反。就目前而言,该函数将始终返回 "redo-tag-attribute-1" . 这可能是你所面对的递归的根本原因。