【发布时间】:2015-10-19 09:44:46
【问题描述】:
我不乐观有办法做到这一点,但我想把问题放在那里。情况:我正在编写一个为新手程序员量身定制的 JavaScript 游戏引擎。我希望主脚本界面尽可能简单且易于访问。理想情况下,脚本最终看起来像这样:
this.backdrop('backdrop-1.png', { effect: 'fade-in', duration: 1000, sync: true });
this.backdrop('backdrop-2.png', { effect: 'fade-in', duration: 500 });
在这种情况下,第一个背景会在一秒钟内完全淡入,然后第二个背景会同步淡入。问题? JavaScript 会在第一个命令完成之前尝试执行第二个命令。
现在,处理这个问题的正确方法是使用 Promise。比如:
this.backdrop('backdrop-1.png', { effect: 'fade-in', duration: 1000 }).then(() => {
this.backdrop('backdrop-2.png', { effect: 'fade-in', duration: 500 });
});
这完全是一种选择。 (事实上,这可能是我必须接受的。)但我不想走这条路有两个原因。首先,它为本来应该是一个简单脚本的内容添加了许多额外的措辞。我希望这对新程序员来说看起来不那么吓人,所有这些嵌套函数都会开始看起来很可怕。其次,promise 不能很好地处理控制流。即使是像 if-then 语句这样简单的事情也会变得粗糙。
我真正想要的是某种方式来做到这一点:
this.backdrop('backdrop-1.png', { effect: 'fade-in', duration: 1000, sync: true });
waitUntilAllPromisesAreResolved();
this.backdrop('backdrop-2.png', { effect: 'fade-in', duration: 500 });
但那是白日梦,不是吗?如果你能想出一种方法来实现它,我很乐意听到。
【问题讨论】:
-
或许你可以使用HTML5工作线程stackoverflow.com/questions/30036/javascript-and-threads/…来处理这种情况
-
哦,这很有趣。我完全忘记了工人!我会进一步研究。
-
@HashPsi 那么你是否在想这样的事情:在工作人员上运行
this.backdrop,然后在while循环中冻结主脚本直到this.backdrop解决?我以前没有尝试过这样的事情,而且我有点担心让主线程进入睡眠状态。不过,这可能是这里的最佳选择。 -
再想一想,它可能不起作用,因为工作人员很可能无法修改 DOM(因为 DOM 访问不是线程安全的)。
-
您可以让
backdrop的异步版本在每个块运行setTimeout时分块执行它。waitUntilAllPromisesAreResolved将侦听backdrop生成的事件,并仅在backdrop完成时返回。不过,保持 UI 响应可能有些棘手。
标签: javascript promise