Javascript 如何使用带有setTimeout()的标签进行中断

Javascript 如何使用带有setTimeout()的标签进行中断,javascript,settimeout,break,Javascript,Settimeout,Break,这是我的密码: mylabel:{ var myTimeout = setTimeout(function(){ SpinnerDialog.hide(); alert("Timeout"); break mylabel; }, 10000); connectWifi(); } 我有一个函数connectWifi(),如果Wi-Fi网络不可用,它可能会挂起,因此我想在固定时间后停止它。此函数包含其他函数,其功能如下: functi

这是我的密码:

mylabel:{
    var myTimeout = setTimeout(function(){
      SpinnerDialog.hide();
      alert("Timeout");
      break mylabel;
    }, 10000);
    connectWifi();
  }
我有一个函数
connectWifi()
,如果Wi-Fi网络不可用,它可能会挂起,因此我想在固定时间后停止它。此函数包含其他函数,其功能如下:

function(){
    function(){
      function(){

      }
    }
  }
当调用timeout函数时,我收到一个错误,显示“Undefined label”

编辑:我的目标不是停止超时功能,而是停止connectWifi功能

如果您想查看connectWifi()函数,这里是代码(我正在使用以下cordova插件:WifiManager、autowifi和CordovaMqTTPlugin):

函数connectWifi(){
cordova.plugins.WifiManager.isWifiEnabled(函数(err,wifiEnabled){
console.log(“isWifiEnabled结果:+wifiEnabled”);
如果(wifiEnabled==false){
cordova.plugins.WifiManager.setWifiEnabled(true,function(err,succes){console.log(err,succes);});
console.log(“--Wifi-Enabled--”);
}
});
window.plugins.autowifi.setssid(s_SSID,s_PASS);
SpinnerDialog.show(null,“Connexion en cours…”,true);
window.plugins.autowifi.connect(功能(scc){
wifiReady=true;
SpinnerDialog.hide();
控制台日志(“Wifi连接”);
log(“首个函数connectMQTT”);
如果(wifiReady){
//连接MQTT
SpinnerDialog.show(null,“Acces au serveur en cours…”,true);
cordova.plugins.CordovaMqTTPlugin.connect({
url:\u url,//仅用于测试目的的公共代理。请尝试使用自托管代理进行生产。
端口:_端口,
clientId:_clientId,
成功:功能{
警报(“连接reussie!”);
连接=真;
log(JSON.stringify);
document.getElementById(“connect”).style.display=“无”;
document.getElementById(“断开”).style.display=“初始”;
document.getElementById(“活动”).innerHTML++=“-->成功:您已连接到,“+\uURL+”:“+\uPort+”
” SpinnerDialog.hide(); SpinnerDialog.show(null,“恢复唐尼…”,true); //一个连接MQTT au主题 cordova.plugins.CordovaMqTTPlugin.subscribe({ 题目:(题目), qos:0, 成功:功能{ SpinnerDialog.hide(); document.getElementById(“活动”).innerHTML+=“-->Success:您已订阅主题“+\u topic+”
” cordova.plugins.CordovaMqTTPlugin.listen(_主题,函数(有效负载,参数,主题,主题模式){ //如果未使用主题模式,则参数将是空对象。 document.getElementById(“活动”).innerHTML+=“-->用于“+topic+”主题的有效负载:“+JSON.stringify(有效负载)+”
” }) }, 错误:函数(e){ SpinnerDialog.hide(); document.getElementById(“活动”).innerHTML+=“-->错误:订阅此主题时出错,“+e+”
”; document.getElementById(“订阅”).style.display=“初始”; document.getElementById(“取消订阅”).style.display=“无”; //警报(“错误!!有问题。请检查控制台”) 控制台日志(e); } }); //--------------------- }, 错误:函数(e){ SpinnerDialog.hide(); 连接=错误; //document.getElementById('status').innerHTML=“déconnecté”; //document.getElementById('statusbar')。className=“w3 bar w3 red” 警报(“连接技术,确保您的无线网络连接和服务提供商puis Veillez reessayer”); document.getElementById(“活动”).innerHTML++=“-->错误:出现了问题,\n”+JSON.stringify(e)+“
”; document.getElementById(“connect”).style.display=“initial”; document.getElementById(“断开”).style.display=“无”; 警报(“错误!!有问题。请检查控制台”) 控制台日志(e); }, onConnectionLost:功能(e){ SpinnerDialog.hide(); log(JSON.stringify(e)); 连接=错误; //document.getElementById('status').innerHTML=“déconnecté”; //document.getElementById('statusbar')。className=“w3 bar w3 red” 警报(“您已断开连接”); document.getElementById(“活动”).innerHTML+=“-->您断开了连接”; document.getElementById(“connect”).style.display=“initial”; document.getElementById(“断开”).style.display=“无”; } }); //-------------------- }否则{ console.log(“wifiReady false”); } }); }

(因为我是法国人,所以很少用法语)

中断发生在一个匿名函数中,该函数在标记语句中声明,但它本身不是语句的一部分。这就是为什么不能从匿名函数跳转到标签

讨论实际问题的一些问题(如何从计时器取消活动):


您将看到,此时没有简单的内置方式。

与其拥有大量代码块,不如将其划分为可重用的小块:

function promisify(fn) {
  return function() {
    return new Promise((resolve, reject) => {
     fn((err, res) => err ? reject(err) : resolve(res));
    });
  }
}

const isWifiEnabled = promisify(cb =>  cordova.plugins.WifiManager.isWifiEnabled(cb));    

const enableWifi = promisify(cb => cordova.plugins.WifiManager.setWifiEnabled(true, cb));

const connect = options => promisify(cb => cordova.plugins.CordovaMqTTPlugin.connect({
  ...options,
  success: res => cb(null, res),
  error: cb,
})();
既然我们已经得到了承诺,我们就可以轻松地将其链接起来并与之合作:

async function ensureWifi() {
  if(!await isWifiEnabled()) await enableWifi();
}
要实现超时,我们只需使用Promise.race:

function cancelAfter(promise, time) {
  const timeout = new Promise((_, reject) => setTimeout(reject, time, new Error("Timeout")));
  return Promise.race(promise, timeout);
}
因此,我们可以:

(async function() {
  try {
    // show loaders here
    await cancelAfter(ensureWifi(), 1000);
    await cancelAfter(connect({ /*...*/ }), 200);
    // All done
 } catch(error) {
    // Api error or timeout
 }
})()

你的目标不明确。
中断
的目的是什么?您从循环中中断,而不是从函数中中断。@Alban您想停止超时函数吗?可能与我编辑的文章重复以添加更多信息。我不知道它是否回答了您的问题@FINDarkside它说我们可以使用中断来退出标记的块我建议使用回调或承诺,因为该方法不需要阻塞。我不确定是否理解所有问题,但您的答案很有趣。你能解释一下这段代码吗<代码>异步函数ensureWifi(){if(!WAIT isW)
(async function() {
  try {
    // show loaders here
    await cancelAfter(ensureWifi(), 1000);
    await cancelAfter(connect({ /*...*/ }), 200);
    // All done
 } catch(error) {
    // Api error or timeout
 }
})()