JavaScript设置超时循环返回值
我有此功能,可ping我的服务器以获取数据中的特定更改:JavaScript设置超时循环返回值,javascript,settimeout,Javascript,Settimeout,我有此功能,可ping我的服务器以获取数据中的特定更改: function connected() { $.ajax({ success : function(d) { if (d.success) { // return data } else { setTimeout(connected, 200); } } }); } (显然,为了让我的意图更清楚,代码已经被精简到了最低限度) 我想做的是在找到一
function connected() {
$.ajax({
success : function(d) {
if (d.success) {
// return data
} else {
setTimeout(connected, 200);
}
}
});
}
(显然,为了让我的意图更清楚,代码已经被精简到了最低限度)
我想做的是在找到一个bool true时返回它,这样我就可以去了
if (connected()) {
// process data
}
(显然,数据存储在全局变量中。)
有没有办法做到这一点
编辑
我可以创建一个“暂停”功能:
function pauseScript(ms) {
ms += new Date().getTime();
while (new Date().getTime() < ms) {}
}
然而,这感觉有点不舒服 要做到这一点,最好在异步模式下继续:
function connected(callback) {
$.ajax({
success : function(d) {
if (d.success) {
callback();
} else {
setTimeout(function() {
connected(callback);
}, 200);
}
}
});
}
//Using :
connected(function(){
//Here i finish my scan result
});
也许,我不太确定在这种情况下,您需要绑定这个(我指的是绑定范围):
如果您的目标浏览器支持JavaScript 1.7或更高版本(在撰写本文时,我认为只有Gecko浏览器支持),那么您可以利用生成器来实现这一点。让我们首先使您的
connect
函数异步(并且测试更简单):
现在将调用代码包装到函数中。(它必须在函数中。)
注意所有的收益率
s无处不在。这是魔法的一部分。调用connect
时需要yield
,在每个函数退出点之前需要yield
现在我们需要定义connect
。您可能需要同步一组异步函数,因此让我们制作一个函数,使函数同步
function synchronize(async) {
return function synchronous() {
return {func: async, args: arguments};
};
}
然后我们可以使用它从connectAsync
创建connect
:
var connect = synchronize(connectAsync);
现在我们需要制作一个运行所有这些魔法的函数。这是:
function run(sync) {
var args = Array.prototype.slice.call(arguments);
var runCallback = args.length ? args[args.length - 1] : null;
if(args.length) {
args.splice(args.length - 1, 1);
}
var generator = sync.apply(window, args);
runInternal(generator.next());
function runInternal(value) {
if(typeof value === 'undefined') {
if(runCallback) {
return runCallback();
}else{
return;
}
}
function callback(result) {
return runInternal(generator.send(result));
}
var args = Array.prototype.slice.call(value.args);
args.push(callback);
value.func.apply(window, args);
}
}
现在,您可以使用以下神奇功能运行main
函数:
run(main);
我应该注意,main
不再可能返回值run
可以接受第二个参数:同步函数完成时调用的回调。要将参数传递给main
(例如,1
、2
和3
),可以这样调用它:
run(main, 1, 2, 3, callback);
如果不需要回调,请传递null
或undefined
要尝试此操作,必须将
script
标记的type
设置为text/javascript;版本=1.7
。JavaScript1.7添加了新的关键字(比如yield
),因此它是向后不兼容的,因此,必须有某种方式将自己与旧代码区分开来
有关生成器的详细信息,请参见。有关协同路由的更多信息,请参阅
尽管如此,由于JavaScript 1.7的支持有限,这是不实际的。此外,这种代码并不常见,因此可能很难理解和维护我建议只使用异步样式,如中所示。不过,实现这一点很简单。欢迎来到异步的奇妙世界!你不能这么做。为什么我不能否决评论?这不是思考的方式!没有什么是不可能的!不要尝试使用while循环来暂停,你只需使用100%的CPU(或浏览器可以获得的最大CPU)锁定浏览器,因此不妨使用同步调用。是的,我说过这似乎有问题,我甚至没有尝试过,我只是在研究暂停脚本,最好的部分是,在if语句中,我调用了另一个函数,因此我可以将该函数作为回调函数!谢谢你自己总结的!有趣,但在目前看来,不切实际。回答得很好!
function run(sync) {
var args = Array.prototype.slice.call(arguments);
var runCallback = args.length ? args[args.length - 1] : null;
if(args.length) {
args.splice(args.length - 1, 1);
}
var generator = sync.apply(window, args);
runInternal(generator.next());
function runInternal(value) {
if(typeof value === 'undefined') {
if(runCallback) {
return runCallback();
}else{
return;
}
}
function callback(result) {
return runInternal(generator.send(result));
}
var args = Array.prototype.slice.call(value.args);
args.push(callback);
value.func.apply(window, args);
}
}
run(main);
run(main, 1, 2, 3, callback);