等到条件为真?

新手上路,请多包涵

我在 JavaScript 中使用 navigator.geolocation.watchPosition ,我想要一种方法来处理用户可能在 watchPosition 找到其位置之前提交依赖于位置的表单的可能性。

理想情况下,用户会定期看到“等待位置”消息,直到获得位置,然后提交表单。

但是,我不确定如何在 JavaScript 中实现它,因为它缺少 wait 函数。

当前代码:

 var current_latlng = null;
function gpsSuccess(pos){
    //console.log('gpsSuccess');
    if (pos.coords) {
        lat = pos.coords.latitude;
        lng = pos.coords.longitude;
    }
    else {
        lat = pos.latitude;
        lng = pos.longitude;
    }
    current_latlng = new google.maps.LatLng(lat, lng);
}
watchId = navigator.geolocation.watchPosition(gpsSuccess,
                  gpsFail, {timeout:5000, maximumAge: 300000});
$('#route-form').submit(function(event) {
    // User submits form, we need their location...
    while(current_location==null) {
        toastMessage('Waiting for your location...');
        wait(500); // What should I use instead?
    }
    // Continue with location found...
});

原文由 Richard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 470
2 个回答

您可以使用超时来尝试重新提交表单:

 $('#route-form').submit(function(event) {
    // User submits form, we need their location...
    if(current_location==null) {
        toastMessage('Waiting for your location...');
        setTimeout(function(){ $('#route-form').submit(); }, 500); // Try to submit form after timeout
        return false;
    } else {
        // Continue with location found...
    }
});

原文由 Chris Pickett 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 Promise 的现代解决方案

function waitFor(conditionFunction) {

  const poll = resolve => {
    if(conditionFunction()) resolve();
    else setTimeout(_ => poll(resolve), 400);
  }

  return new Promise(poll);
}

用法

waitFor(_ => flag === true)
  .then(_ => console.log('the wait is over!'));

或者

async function demo() {
  await waitFor(_ => flag === true);
  console.log('the wait is over!');
}

参考

承诺

箭头函数

异步/等待

原文由 Lightbeard 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题