只对连续流作出一次反应的模式

Pattern for reacting to a continuous stream only once

本文关键字:一次 模式 连续      更新时间:2023-09-26

在处理涉及鼠标的X、Y位置或任何时间的数据不断更新的事件时,使用什么模式在T周期内仅对特定情况做出一次反应?

例如,如果我正在通过accept选项收听可放下的handder, accept函数会不断执行以检查可放下性,但是我如何才能在T周期内只向用户弹出一次消息而不让弹出的消息轰击我的屏幕?

$scope.layoutDropOptions = {
    hoverClass: 'ui-state-highlight',
    multiple: true,
    tolerance: 'pointer',
    accept: function (elem) {
        var isAField = $(elem).hasClass("field");
        var isFromSideBar = $(elem).parent().hasClass("fields");
        var onTheSame = $(this).find('#' + $(elem).attr("id")).size() != 0;
        var alreadyExists = $('.layoutContainer').find('#' + $(elem).attr("id")).size() != 0;
        if (alreadyExists && isFromSideBar) {
            // need to pop only once:
            //toaster.pop('warning',
            //    UserMessages.formBuilder.duplicateField.title,
            //    UserMessages.formBuilder.duplicateField.body);
            return false;
        }
        return isAField && !onTheSame ? true : false;
    }
}

我正在这样做,但我想也许有人能想出一个更好的方法来获得积分?

var lastCall = 0;
$scope.layoutDropOptions = {
    hoverClass: 'ui-state-highlight',
    multiple: true,
    tolerance: 'pointer',
    accept: function (elem) {
        var isAField = $(elem).hasClass("field");
        var isFromSideBar = $(elem).parent().hasClass("fields");
        var onTheSame = $(this).find('#' + $(elem).attr("id")).size() != 0;
        var alreadyExists = $('.layoutContainer').find('#' + $(elem).attr("id")).size() != 0;
        if (alreadyExists && isFromSideBar) {
            if (new Date() - lastCall > 1000) {
                lastCall = new Date();
                toaster.pop('warning',
                    UserMessages.formBuilder.duplicateField.title,
                    UserMessages.formBuilder.duplicateField.body);
            }
            return false;
        }
        return isAField && !onTheSame ? true : false;
    }
}