javascript,等待某事为真,然后运行操作

标签 javascript

好吧,标题 kindof 说明了我的需要。因为在 Javascript 超时异步中我需要知道什么时候变成真的。我不想要忙循环。

想出了:

function do_when(predicate, action, timeout_step) {
    if (predicate()) {
        action();
    } else {
        setTimeout(do_when, timeout_step, predicate, action, timeout_step);
    }
}

它是好的 Javascript 还是我可以做得更好?

最佳答案

根据谓词是什么,您可能能够将您的问题放入 observer pattern 的实现中.前一段时间我写了一篇关于 creating JavaScript objects with observable properties 的博文.这实际上取决于谓词 是什么,但这可能会让您使用如下代码完成大部分工作:

var observable = createObservable({ propToWatch: false });
observable.observe('propToWatch', function (oldValue, newValue) { 
    alert('propToWatch has changed from ' + oldValue + ' to ' + newValue); 
});
observable.propToWatch(true); // alert pops

当然,这对于您的示例来说可能有点过分了。由于它从未明确列出(注意,我不是一个很好的博主),这里是完成这项工作所需的完整代码:

var createMediator = function () {
    var events = {};
    return {
        subscribe: function (eventName, callback) {
            events[eventName] = events[eventName] || [];
            events[eventName].push(callback);
        },
        publish: function (eventName) {
            var i, callbacks = events[eventName], args;
            if (callbacks) {
                args = Array.prototype.slice.call(arguments, 1);
                for (i = 0; i < callbacks.length; i++) {
                    callbacks[i].apply(null, args);
                }
            }
        }
    };
};

var createObservable = function (properties) {
    var notifier = createMediator(), createObservableProperty, observable;
    createObservableProperty = function (propName, value) {
        return function (newValue) {
            var oldValue;
            if (typeof newValue !== 'undefined' &&
                value !== newValue) {
                oldValue = value;
                value = newValue;
                notifier.publish(propName, oldValue, value);
            }
            return value;
        };
    };
    observable = {
        register: function (propName, value) {
            this[propName] = createObservableProperty(propName, value);
            this.observableProperties.push(propName);
        },
        observe: function (propName, observer) {
            notifier.subscribe(propName, observer);
        },
        observableProperties: []
    };
    for (propName in properties) {
        observable.register(propName, properties[propName]);
    }
    return observable;
};

我的可观察对象在内部使用了我曾经为一个项目编写的一个小型事件框架(createMediator 函数)。 (之前意识到 jQuery 支持的自定义事件。D'oh!)同样,这可能会或可能不会满足您的需求,但我认为这是一个有趣的 hack。享受吧!

关于javascript,等待某事为真,然后运行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2296583/

相关文章:

javascript - 使用 django 将值传递给引导模式形式

javascript - 单击打开 Accordion ,第二次单击关闭 Accordion

javascript - 如何将 javascript 数组发送到 yii 中的 Controller

javascript - 清理 `child_added` 内的 Firebase 事件处理程序?

javascript - MySQL查询后无法运行js命令

javascript - 在 Vuejs 模板上循环对象数组

javascript - 如何在文本框中应用 mask

javascript - onclick 事件在 IE8 中被破坏

javascript - 使用 Redux 时哪种更好的 CRUD 编码风格?

javascript - css/javascript visibility visible/hidden 在 Blackberry 上非常慢