JavaScript设置超时循环返回值

JavaScript设置超时循环返回值,javascript,settimeout,Javascript,Settimeout,我有此功能,可ping我的服务器以获取数据中的特定更改: function connected() { $.ajax({ success : function(d) { if (d.success) { // return data } else { setTimeout(connected, 200); } } }); } (显然,为了让我的意图更清楚,代码已经被精简到了最低限度) 我想做的是在找到一

我有此功能,可ping我的服务器以获取数据中的特定更改:

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);