2

长话短说,没有回调函数可以做这样的事情吗?

function foo(){
  return 'foo';
}
function bar(){
  x = setTimeout(foo, 2000);
  alert(x);
}

无需修改 foo() 函数。添加一个中介功能会很好,但我认为这不会完成任何事情。

长话短说:我希望通过 window.open 模拟 window.showModalDialog ,而不必在任何使用该死的东西的地方进行重要的代码重写。我发现的唯一建议是使用 while 循环或 ping 服务器来模拟 sleep()。这两种解决方案都没有让我觉得理想,我想知道是否还有其他方法可以做这样的事情减去回调函数方法?

4

4 回答 4

6

简短的回答:

我会更详细地回答,但是由于您要求“简短”的回答并排除了另一个“回调”,因此只剩下要说的了。

setTimeout始终返回一个标识符以清除超时,并且您从传入的函数返回setTimeout的任何内容都将被忽略。

于 2012-12-05T19:15:04.850 回答
3

不,那是不可能的。然而,你可以返回代表未来值的东西,然后让你添加回调:一个Promise

于 2012-12-05T19:16:12.343 回答
0

重构你的设计。您很可能通过超时来实现您正在寻找的东西,但不是这样。不要违背约定,使用回调

function foo(){
 alert('foo');
}
function bar(){
 setTimeout(foo, 2000);
}

就将超时保存在变量中而言,它用于清除超时。

timeoutID = setTimeout();
window.clearTimeout(timeoutID);
于 2012-12-05T19:16:30.780 回答
0

setTimout 已经返回了一些东西,但它不是评估表达式的值。它返回一个 timout 对象,让您在需要时中止并稍后执行其他操作。setTimeout 只是告诉一个函数在将来执行。

如果您想获得可能适用于您的情况的功能,您可以使用以下内容:

var answer = null;
setTimeout(function() {
    /*do something to 'answer'*/
    answer = 14;
}, 1000);

注意:这意味着您几乎无法控制何时设置“答案”。这就是为什么最好总是使用回调,因为你告诉你的代码“将来,当你有一个值时,在它上面执行这个函数”。

于 2015-04-17T23:32:15.920 回答