好吧标题有点说我需要什么.因为在Javascript超时异步中我需要知道什么时候变成了现实.我不想要忙碌.
想出了:
function do_when(predicate, action, timeout_step) {
if (predicate()) {
action();
} else {
setTimeout(do_when, timeout_step, predicate, action, timeout_step);
}
}
Run Code Online (Sandbox Code Playgroud)
这是好的Javascript还是我可以做得更好?
根据谓词的不同,您可以将问题纳入观察者模式的实现中.不久前,我写了一篇关于创建具有可观察属性的JavaScript对象的博客文章.这实际上取决于谓词是什么,但这可能会让你大部分时间都使用这样的代码:
var observable = createObservable({ propToWatch: false });
observable.observe('propToWatch', function (oldValue, newValue) {
alert('propToWatch has changed from ' + oldValue + ' to ' + newValue);
});
observable.propToWatch(true); // alert pops
Run Code Online (Sandbox Code Playgroud)
当然,这可能对你的例子来说太过分了.由于它从未明确列出(我不是一个非常好的博客),这里是完成这项工作所需的完整代码:
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;
};
Run Code Online (Sandbox Code Playgroud)
我的可观察对象在内部使用了我为项目编写过一次的小事件框架(createMediator函数).(在实现jQuery支持的自定义事件之前 .D'哦!)同样,这可能会或可能不会对您的需求有所不足,但我认为这是一个有趣的黑客.请享用!
它足够不错,如果它足够容易阅读并且工作得很好,那么它通常是很好的 javascript。
从性能角度来看,通常最好在发生设置为 true 的情况时调用该函数。因此,无论执行什么函数以predicate()返回 true,您都可以action()在最后调用。但我确信如果可以的话你也会这么做,对吧?
您还可以考虑使用回调,在其中将 javascript 函数注册到特定变量或函数参数,并且当该函数运行时,它会执行设置给回调变量的任何函数。