我正在尝试执行一个循环来执行代码并观察手机 alpha,然后转到特定页面,但我的循环仅适用于我的第一个和第二种情况 if,以及第一个 else if。
window.addEventListener("deviceorientation",findPlace);
for (var i = 0; i < count; i++) {
findPlace();
}
function findPlace(evt) {
if (evt.alpha < 90 || evt.alpha > 360) {
unit.goToScreenAction(ctx, { screen: unit.find('Norte') }, noop);
window.alpha = evt.alpha;
unit.find('alphatxt').setText(window.alpha + '');
}
else if (evt.alpha < 180 || evt.alpha > 90) {
unit.goToScreenAction(ctx, { screen: unit.find('Este') }, noop);
window.alpha = evt.alpha;
unit.find('alphatxt3').setText(window.alpha + '');
}
else if (evt.alpha < 360 || evt.alpha > 270) {
unit.goToScreenAction(ctx, { screen: unit.find('Sur') }, noop);
window.alpha = evt.alpha;
unit.find('alphatxt1').setText(window.alpha + '');
}
else if (evt.alpha < 270 || evt.alpha > 180) {
unit.goToScreenAction(ctx, { screen: unit.find('Oeste') }, noop);
window.alpha = evt.alpha;
unit.find('alphatxt2').setText(window.alpha + '');
}
else {
unit.goToScreenAction(ctx, { screen: unit.find('Nada') }, noop);
}
}
最佳答案
您正在混契约(Contract)步和异步代码。
当您附加 deviceorientation
事件处理程序时,它是同步的。 for
循环紧随其后同步执行。
当 deviceorientation
事件被触发时,您的 findPlace
函数将被异步调用。换句话说,您的脚本不会进行调用。浏览器可以。
问题是,您还在 for
循环中同步调用 findPlace
。并且您的 count
变量未定义。
您可能会感到困惑,因为有时在其他语言(例如 Java 或 C++)的基于事件的框架中使用术语“事件循环”。对于 JavaScript,事件循环由浏览器处理。你不必关心它。只需注册事件处理程序,您的代码就会开始运行。
现在请注意其他注释,findPlace
函数内部存在逻辑问题需要解决。
编辑:为了做出更完整的答案,您的 if/else
结构应如下所示:
window.addEventListener("deviceorientation",findPlace);
function findPlace(evt) {
if (evt.alpha >= 0 && evt.alpha < 90) {
...
}
else if (evt.alpha >= 90 && evt.alpha < 180) {
...
}
else if (evt.alpha >= 180 && evt.alpha < 270) {
...
}
else if (evt.alpha >= 270 && evt.alpha < 360) {
...
}
else {
unit.goToScreenAction(ctx, { screen: unit.find('Nada') }, noop);
}
}
不确定 alpha
的情况恰好 360。规范说这可能会发生,但它相当于 0。无论如何,这是一种罕见的情况,并且不会'不会造成太多麻烦。
关于javascript循环遍历多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44687521/