Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript,等待某些内容为真,然后运行操作_Javascript - Fatal编程技术网

javascript,等待某些内容为真,然后运行操作

javascript,等待某些内容为真,然后运行操作,javascript,Javascript,好吧,这个标题说明了我需要什么。因为在Javascript异步超时中,我需要知道什么时候事情会变成真的。我可不想干杂活 提出: function do_when(predicate, action, timeout_step) { if (predicate()) { action(); } else { setTimeout(do_when, timeout_step, predicate, action, timeout_step);

好吧,这个标题说明了我需要什么。因为在Javascript异步超时中,我需要知道什么时候事情会变成真的。我可不想干杂活

提出:

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

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

它足够好,如果它足够容易阅读并且工作正常,那么它通常是好的Javascript

就性能而言,通常最好在任何设置为true的情况下调用该函数。因此,在执行任何函数以使
predicate()
返回true时,您可以在末尾调用
action()
。但我相信如果可以的话,你会这么做的,对吗


您还可以看看如何使用回调,在回调中,您将javascript函数注册到特定变量或函数参数,当函数运行时,它将执行设置为回调变量的任何函数。

如果您的谓词在变量更改时变为true,下面是另一个解决方案:

假设我们想在对象a的值变为2时记录“老大哥在监视你们”

function observable (value, condition, callback){
    this.value = value;
    this.condition = condition;
    this.callback = callback;
}

observable.prototype = {
    get value () {
        return this._value;
    },
    set value (value) {
        this._value = value;
        if (this.condition && this.callback && this.condition (value)) {
            this.callback (value);
        }
    }
};

condition = function (value) {
    console.log ('condition', value);
    return value === 2;
}

callback = function (value) {
    console.info ('Big Brother is watching you!');
}

var a = new observable (0, condition, callback);

console.log ('set value to 1');
a.value = 1;
console.log ('set value to 2');
a.value = 2;
console.log ('set value to 3');
a.value = 3;

您可以在firefox中尝试此示例,这取决于谓词是什么,您可能能够将您的问题应用到的实现中。不久前,我写了一篇关于的博客文章。这实际上取决于谓词是什么,但这可能会让您在大多数情况下使用如下代码:

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;
};
var createMediator=函数(){
var事件={};
返回{
订阅:函数(eventName,回调){
事件[eventName]=事件[eventName]| |[];
事件[eventName]。推送(回调);
},
发布:函数(eventName){
变量i,回调=事件[eventName],args;
如果(回调){
args=Array.prototype.slice.call(参数,1);
对于(i=0;i

我的可观察对象在内部使用了一个小事件框架(createMediator函数),我曾经为一个项目编写过这个框架。(在意识到jQuery支持定制事件之前,这可能是过分的,也可能不是过分的,但我认为这是一个有趣的黑客行为。享受吧

@谓词是函数,操作也是函数谓词是在调用操作之前必须为true的条件。==>我觉得不错。什么是获取和设置?这是标准的javascript吗?getter和setter不会在所有javascript实现中都起作用。如果安装并打开firebug,这不会起作用。(因为您使用的是控制台)嗯,我不知道它是否是标准的javascript,我只是发现(从未真正使用过)它不适用于internet explorer,根据它在firefox、safari和operaNow中的工作情况,我再次查看这段代码,我希望您可以编写
observable.propToWatch.observe(function(){…})
。哦,好吧。也许我以后可以再修补一下。